perm filename GOLOOK.FAI[GO,ALS] blob sn#105687 filedate 1974-06-12 generic text, type T, neo UTF8
00100		TITLE	GOLOOK	7/24/70
00200	;	LAST MODIFIED BY GJA 7/2/72
00300	
00400		EXTERN	GBOARD,GB1,KOTAC,STRPTR,GB1TST,GODOWN,EYENUM
00500		EXTERN	NDXFOR,GRPPTR,PNTDPY,GRUPNO,ELTNOS,GBDTST,G1IKKN
00600		EXTERN	PFORCE,IFORCE,KFOR,BRDDPY,MSGDPY,TTYGUY,HEURBT
00700		EXTERN	DRIVER,DRIVR1,TACSAV,ADLEND,EYDIAG,G1DIAG
00800		EXTERN	EYCHEK,TACSV1
00900		INTERN	FORCES,SAVES,NGHBR1,NGHBOR,STRSET,BKFLAG,EXMOVE
01000		INTERN	STRRST
01100	
01200	
01300	OPDEF ERRUUO [5B8]
01400	DEFINE SAILERR & (NMBR,MESSAGE) <
01500		ERRUUO 1,[ASCIZ /GOLOOK ERROR NUMBER &NMBR& &MESSAGE/]>
01600	
01700	
01800	
01900	;*****SYMBOLIC REGISTERS USED OR AVAILABLE
02000		↓ZER←0
02100		↓TAC←1
02200		↓TAC1←2
02300		↓TAC2←3
02400		↓TAC3←4
02500		↓TAC4←5
02600		↓TAC5←6
02700		↓FRIEND←7
02800		↓ENEMY←10
02900		↓STKREG←10
03000		↓BLANK←11
03100		↓BWREG←12
03200		↓SEARCH←13
03300		↓REPLCE←14
03400		↓CLEAR←15
03500		↓PDP←17
03600	
03700	;*****CONSTANT SYMBOLS OF LARGE IMPORT
03800		MXARNO←=50	;MAX NUMBER OF ARMIES (OR WALLS)
03900		BRDWTH←=21	;BOARD WIDTH, INCLUDING EDGES
04000		STRMAX←=127	;MAX NUMBER OF STRINGS
04100		WHTOCC←400000	;WHITE POINT OCCUPANCY
04200		WHTSHF←-=17	;SHIFTS WHTOCC TO RIGHT END OF WORD
04300		BLKOCC←200000	;BLACK POINT OCCUPANCY
04400		BNKOCC←100000	;BLANK POINT OCCUPANCY
04500		NONOCC←40000	;OFF-EDGE POINT
04600		STRCNT←1	;STRING COUNTER
04700		STRBTS←177	;MAXIMUM ALLOWABLE # OF STRINGS
04800		GRPCNT←200	;GROUP COUNTER
04900		GRPBTS←177	;MAXIMUM ALLOWABLE # OF GROUPS
05000		WHTNGH←1	;WHITE NEIGHBOR COUNTER
05100		BLKNGH←20	;BLACK NEIGHBOR COUNTER
05200		NGHBTS←17	;MAXIMUM ALLOWABLE # OF NEIGHBORS
05300		OCCBIT←10	;POINT OCCUPIED NEIGHBOR BIT
05400		AWSRRH←1	;STRING LIBERTY COUNTER
05500		AWSRRM←777	;MAXIMUM ALLOWABLE # OF STR LIBS
05600		AWSLRH←1000	;STRING STONE COUNTER
05700		AWSLRM←777	;MAX ALLOWABLE # OF STONES
05800		BCON←100000	;CONNECTED TO BLACK
05900		WCON←200000	;CONNECTED TO WHITE
06000		HBCON←40000	;HALF-CONNECTED TO BLACK
06100		HWCON←20000	;HALF-CONNECTED TO WHITE
06200		LBSCUT←4	;MAX # TARGET STRING LIBS WE WILL CHASE
06300		LCMPLX←3	;MAX # TARGET COMPLEX LIBS ≤ LCMPLX+CUTLBS
06400		MXSTRG←=12	;MAX NUMBER OF STRINGS CONSIDERED
06500		MXMVES←=15	;MAX NUMBER OF MOVES GENERATED
06600		PHASE1←4	;MAX NUMBER OF PHASE ONE ACCEPTABLES
06700		PHASE2←2	;MAX NUMBER OF PHASE TWO ACCEPTABLES
06800		PH1CUT←=100	;PHASE ONE CUTOFF DEPTH
06900		MAXMOV←=30	;MAX NUMBER OF MOVES ON MOVE LIST
07000		MAXSTR←=30	;MAX NUMBER OF STRINGS ON STRINGS LIST
07100		TACBIT←400000	;GBOARD TACTICAL SCOPE MARKER
07200	
07300	
07400	
07500	
07600	;**********
07700	;	THE FOLLOWING LOCATIONS ARE USED AS TEMPORARY STORAGE DURING
07800	;THE LOOKAHEAD EVALUATIONS.  SOME ARE MUCH MORE PERMANENT THAN OTHERS.
07900	;**********
08000	NOKVEC:	BLOCK	12	;THIS BLOCK HOLDS THE QUANTITIES GOT FROM
08100				;THE CALL TO LIBEST AT THE PROPOSED MOVE POINT.
08200				;THE FIRST 11 LOCATIONS CORRESPOND IN MEANING
08300				;TO THOSE IN LIBVEC (SEE PAGE 9).  NOKVEC+11
08400				;HOLDS # "NEW" LIBS WRT TARGET COMPLEX.
08500	R16SAV:	0		;HOLDS REGISTER 16 FOR SAIL
08600	FORSAV:	0		;-1 MEANS SAVER IS MOVING, 0 MEANS FORCER
08700	BNDCNL:	0		;KEEPS TRACK OF THE NUMBER OF "ACTIVE" MOVES
08800	BNDCNS:	0		;KEEPS TRACK OF THE NUMBER OF "ACTIVE" STRINGS
08900	T2SAVE:	0		;HOLDS VALUE OF REG TAC2 IN RIGHT HALF
09000	NFRND:	0		;COUNTS #FRIENDLY NEIGHBORS ∨ HOLDS "FRIENDLY" MARK
09100	NBLANK:	0		;COUNTS # BLANK NEIGHBORS
09200	KOSAVE:	0		;SET IF KOTAC MEANS KO FOR MOVER
09300	KOSAV1:	0		;SET IF KOTAC MEANS KO FOR NON-MOVER
09400	TCMPLX:	0		;# BLANKS IN TARGET COMPLEX
09500	TEMP1:	0
09600	TEMP2:	0
09700	TEMP3:	0
09800	STRGNM:	0		;HOLDS STRING NAMES DURING LIBERTY ADD-ONS
09900	LIBSNO:	0		;# LIBS, USED BY NEIGHS
10000	TGLIBS:	0		;# TARGET LIBERTIES
10100	XTDFRC:	0		;ADDRESS OF SAVER WINNER BY EXTENSION
10200	XTDFR1:	0		;SECOND EXTENSION WINNER ADDRESS
10300	TWOATR:	0		;COUNTS # FORCER SELF-ATES CREATED BY SAVER MOVE
10400	PDPSAV:	0		;HOLDS REGISTER 17 (PDP) FOR EXTERNAL WORLD
10500	NOLIBS:	0		;# LIBS, USED BY NEIGHS
10600	SAVWIN:	0		;COUNTS # SAVER WINNER MOVES
10700	SAVWN1:	0		;COUNTS # SAVER WINNER MOVES
10800	NOTWIN:	0		;DISABLE CERTAIN WINNERS WHEN NDXFOR=5
10900				;OR WHEN TARGET MAY BE LADDERED
11000	MUSTSV:	0		;NAME OF STRING WHOSE DIRECT LOSS SAVES TARGET
11100	MSTSAV:	0		;NAME OF STRING WHOSE LADDER LOSS SAVES TARGET
11200	EYECNT:	0		;COUNTS # EYES IN TARGET COMPLEX
11300	SVCRIT:	0		;-1 MEANS SAVER HAS 1-LIB TARGET STRING
11400	LOWBND:	0		;CUTOFF ON # MOVES ALLOWED AFTER PRUNING
11500	STRRST:	0		;IF ≠0 THEN MARK TACTICAL SCOPE IN GBOARD
11600	EXMOVE:	0		;ADDRESS OF "FORCED" EXCHANGE (FOUND BY NGHBOR)
11700	BKFLAG:	0		;≠0 MEANS SAVER MUST BREAK THROUGH FORCER WALL
11800	CONFLG:	0
11900	STRONG:	0		;# WEAK CHASER STRINGS WHICH REALLY ARENT
12000	NOCONS:	0		;# CONNECTION POINTS FOR STRING (FOUND BY NEIGHS)
12100	MORLBS:	0		;LIBS FROM BEING CONNECTED TO "NEW" STRING
12200	MORLBF:	0		;FORCER EXTRA LIBS FROM CONNECTION
12300	AUGFLG:	0		;USED TO REGULATE MOVE AUGMENTING LOOP (AT AUGFS1)
12400	AUGSRT:	0		;HOLDS ADDRESS OF THE FIRST AUGMENTING MOVE
12500	WEAKNT:	BLOCK	=10	;HOLDS NAMES OF WEAK NON-TARGETS WHICH ARENT
12600	FSLIBS:	BLOCK	6	;HOLDS NAMES OF STRONGLY AFFECTED NEIGHBOR STRINGS
12700					;0 -- SAVER STRINGS CAPTURED
12800					;1 -- SAVER STRINGS ATARIED
12900					;2 -- SAVER STRINGS 2-LIBBED
13000					;3 -- FORCER STRINGS CAPTURED
13100					;4 -- FORCER STRINGS ATARIED
13200					;5 -- FORCER STRINGS 2-LIBBED
13300	BLKSAV:	BLOCK	MAXSTR+1
13400	AFFSTR:	BLOCK	MAXSTR+1	;HOLDS LIST OF AFFECTED STRINGS
13500	AFFMOV:	BLOCK	MAXMOV+1	;HOLDS LIST OF PROPOSED MOVES
13600	LBSSTR:	BLOCK	MAXMOV+1	;HOLDS # LIBERTIES FOR EACH SIDE
13700	AUXBTS:	BLOCK	MAXMOV+1	;SPECIAL PROPERTIES TURN ON BITS HERE
13800		0
13900	CONPNT:	BLOCK	6		;USED BY NEIGHS TO FIND CONNECTIONS
14000	REGSTR:	BLOCK	16		;TEMPORARY STORAGE ARRAY
14100		
14200		
14300	
14400	
14500	;**********
14600	;	THE FOLLOWING QUANTITIES ARE STATUS BITS COMPUTED FOR EACH PROPOSED
14700	;BLANK TURNED UP IN THE PLAUSIBLE MOVE SEARCH FOR CAPTURING A PARTICULAR
14800	;STRING OF STONES.  THE BITS ARE SET IN THE LEFT HALF OF THE WORD
14900	;CONTAINING THE BOARD POSITION OF THE POINT, AND THEN A SIMPLE BUBBLE
15000	;SORT IS USED TO DETERMINE MOVE PRIORITY.
15100	;**********
15200		NATARI←200000		;NOT ATARI POINT FOR SIDE MOVING
15300		EYMAKE←100000		;MAKES AN EYE FOR SAVER
15400		NWLIB2←40000		;2 NEW LIBS ADDED TO TARGET COMPLEX
15500		NEWLIB←20000		;1 NEW LIB ADDED TO TARGET COMPLEX
15600		NXTTGT←10000		;NEXT TO TARGET STRING
15700		WKNTGT←4000		;WEAK NON-TARGET EXTEND
15800		CONTGT←2000		;NEXT FRIENDLY STRING NEXT TARGET
15900		NREDUC←1000		;SAVER MOVE DOES NOT REDUCE TARGET LIBS
16000		CAPENM←400		;NEXT TO ONE-LIB STRING (NON-MOVING)
16100		CAPFRD←200		;NEXT TO ONE-LIB STRING (MOVING)
16200		TWOATE←100		;CREATES 2 NEIGHBORING FORCER SELF-ATARIES
16300		THRTGS←40		;THIS MOVE ATARIES AN OPPOSING STONE
16400		SAVTGS←20		;ATARI POINT FOR OPPONENT
16500		TWOLIB←10		;TWO-LIBERTY STRING IS INVOLVED IN MOVE
16600		NON1ST←4		;NOT ON FIRST LINE
16700		WKSIDE←2		;ON FORCER WEAK SIDE
16800		NON2ND←1		;ABOVE SECOND LINE
16900	
17000	
17100	
17200	
17300	
17400	;**********
17500	;	THE RETURNS FROM FORCES AND SAVES ARE IMPORTANT TO THE EVALUATION
17600	;PROGRAM ONLY WITH RESPECT TO SIGN.  A POSITIVE RETURN MEANS THE STRING IN
17700	;QUESTION WAS CAPTURED, WHILE A NEGATIVE RETURN MEANS THE STRING GOT AWAY.
17800	;THE ABSOLUTE VALUE OF THE RETURN IS A SIGNAL OF THE REASON WHY THE LINE
17900	;OF PLAY WAS TERMINATED.  THE FOLLOWING VALUES ARE CURRENTLY USED:
18000	;
18100	;	1 ... GENERAL PURPOSE, NO SPECIFIC MEANING
18200	;	2 ... LADDER ANALYSIS GAVE THE ANSWER DIRECTLY
18300	;	3 ... KO WAS IMPORTANT IN LIFE OR DEATH
18400	;	4 ... CAPTURE OF STONES DECIDED THE ISSUE
18500	;	5 ... TOO MANY STRINGS TO CONTINUE THE ANALYSIS
18600	;	6 ... TOO MANY PROPOSED MOVES TO CONTINUE THE ANALYSIS
18700	;	7 ... SAVER HAS A WAY TO REFUTE THE LAST FORCER MOVE
18800	;	8 ... FORCED MOVE WAS ILLEGAL OR SELF-ATARI
18900	;	9 ... SAVER CAN WIN BY DIRECT EXTENSION
19000	;	10 .. SAVER CAN WIN BY A NON-EXTENSION MOVE
19100	;	11 .. GOT TO PRUNER WITH NO LEGAL MOVES
19200	;	12 .. FORCER HAS LADDER LOSS + ANOTHER PROBLEM
19300	;	13 .. SAVER CAN WIN BECAUSE HE HAS TWO EYES
19400	;	14 .. FORCER REFUTES ITS OWN PREVIOUS MOVE
19500	;	15 .. SAVER WINS BECAUSE TARGET COMPLEX TOO BIG
19600	;	999 . ANALYSIS IS TOO LONG (SET IN GOEVAL)
19700	;
19800	;**********
19900	
20000	
20100	
20200	
20300	
20400	;**********
20500	;      THE AUXILIARY BITS ARE USED TO RECORD EXCEPTIONAL CONDITIONS HOLDING
20600	;FOR PARTICULAR MOVES.  IF THE CONDITION IS TRUE, IT IS IMPORTANT ENOUGH TO
20700	;ALTER THE SCORING GOT BY THE 17 LEFTHALF BITS.
20800	;**********
20900	;RIGHT HALF BITS.....
21000		STHRET←1		;SAVER THREAT POINT
21100		SDBLAT←2		;SAVER DOUBLE ATE POINT
21200		SEMPT←4			;SAVER EMPTY TRIANGLE POINT
21300		SATTWO←10		;SAVER ATARI AND TWOLIB POINT
21400		SREVIV←20		;SAVER CAN PROFITABLY REVIVE STONES
21500		LADBRK←40		;BREAKS LADDER ON TARGET
21600		MAYLAE←100		;THE LADDER MAY WORK FOR NONMOVER
21700		NLADDE←200		;THE LADDER DOESNT WORK FOR NONMOVER
21800		NSTHRT←400		;NOT SAVER THREAT POINT
21900		NLADDR←1000		;THE LADDER DOESNT WORK FOR MOVER
22000		MAYLAD←2000		;THE LADDER MAY WORK FOR MOVER
22100		LADLOS←4000		;LADDER LOSS POINT (THREAT)
22200		NEWSTG←10000		;CONNECTED TO NON-TARGET-COMPLEX FRIENDLY
22300		FDBLAT←20000		;FORCER DOUBLE ATE POINT
22400		HLPSTR←40000		;HELPS FORCER PLAY ON SELF-ATE POINT
22500		FTHRET←100000		;TARGET MAY BE LADDERABLE
22600	;LEFT HALF BITS.....
22700		LADLSM←1		;LADDER LOSS IF MOVER MOVES HERE
22800		HEURCF←2		;CAPFRD AWARD BY LADCHK
22900		FORHLP←4		;SAVER ATARI OF FORCER STONE
23000		LADLSN←10		;LADDER LOSS IF NON-MOVER MOVES HERE
23100		SSATE←20		;SAVER SELF-ATARI POINT
23200		FSATE←40		;FORCER SELF-ATARI POINT
23300		SILLPT←100		;SAVER ILLEGAL MOVE POINT
23400		FILLPT←200		;FORCER ILLEGAL MOVE POINT
23500		STWOLB←400		;SAVER STONES TWOLIBBED HERE
23600		FTWOLB←1000		;FORCER STONES TWOLIBBED HERE
23700		KOTAKS←2000		;SAVER TAKES KO AT THIS POINT
23800		KOTAKF←4000		;FORCER TAKES KO AT THIS POINT
23900		NEWCGT←10000		;SAVEX CODE MADE THIS POINT CONTGT
24000		SURCAP←20000		;CERTAIN CAPTURE OF TWO-LIB STONES
24100		SNACAP←40000		;CAPTURE BY SNAPBACK BY SIDE MOVING
24200		SNACPN←100000		;CAPTURE BY SNAPBACK BY SIDE NOT MOVING
24300	
24400	
24500	
24600	
24700	
24800	;**********
24900	;	REGULATE CUTOFFS PARTIALLY IN TERMS OF CURRENT DEPTH OF SEARCH
25000	;IN ORDER TO HELP COTROL WANDERING ANALYSES.  THE LEFT HALF OF CUTOFF
25100	;CONTAINS MAX # LIBS ALLOWED IN TARGET, WHILE THE RIGHT HALF CONTAINS
25200	;THE MAX DEPTH FOR WHICH THIS NUMBER IS ALLOWED.
25300	;**********
25400	CUTOFF:	XWD	LBSCUT+2,0
25500		XWD	LBSCUT+1,=20
25600		XWD	LBSCUT,=50
25700		XWD	LBSCUT-1,=75
25800		XWD	LBSCUT-2,=120		;STRING "GETS AWAY" AT PLY =24
25900		XWD	LBSCUT-3,=1000
26000	
26100	CUTLBS:	0		;CURRENT VALUE OF LIBS CUTOFF
26200	CUTLB1:	0		;CUTLBS+1
26300	CUTLB2:	0		;CUTLBS+2
26400	CUTLBX:	0		;CURRENT VALUE OF TCMPLX CUTOFF
26500	
26600	;**********
26700	;	SAVES IS THE HEADER FOR PLAYFS WHEN WE WISH TO RANK MOVES
26800	;ACCORDING TO THEIR UTILITY IN SAVING A SPECIFIED STRING OF STONES.  THIS
26900	;ROUTINE IS CALLED ONLY DURING LOCAL LOOKAHEAD.
27000	;**********
27100	SAVES:	SETOM	FORSAV
27200	
27300	;*****INITIALIZE FOR FORCES, SAVES
27400		SETOM	KFOR		;INITIALIZE REUTUN VALUE TO "ESCAPES"
27500		MOVEI	TAC,1
27600		HRRZ	TAC3,CUTOFF(TAC)
27700		CAMG	TAC3,NDXFOR
27800		AOJA	TAC,.-2
27900		HLRZ	TAC3,CUTOFF(TAC)	;# LIBERTIES CUTOFF
28000		MOVEM	TAC3,CUTLBS
28100		MOVEI	TAC,1(TAC3)
28200		MOVEM	TAC,CUTLB1
28300		MOVEI	TAC,2(TAC3)
28400		MOVEM	TAC,CUTLB2
28500		MOVEI	TAC,LCMPLX(TAC3)
28600		MOVEM	TAC,CUTLBX
28700		MOVEI	TAC,3
28800		SETZM	IFORCE(TAC)
28900		SETZM	HEURBT(TAC)
29000		SOJGE	TAC,.-2
29100		SETZM	SVCRIT
29200		MOVE	TAC,-1(PDP)	;STRING BASE POINT
29300		MOVEM	16,R16SAV	;SAVE REG 16
29400		MOVEM	PDP,PDPSAV
29500		MOVE	PDP,BRDDPY
29600		SETZM	=20(PDP)
29700		ADD	PDP,[IOWD =79,=21]
29800		JUMPE	TAC,NOFORC
29900		LDB	SEARCH,[POINT 7,GB1(TAC),35]	;STRING NAME
30000		LDB	TAC2,[POINT 9,STRPTR(SEARCH),35]	;# LIBERTIES
30100		JUMPE	SEARCH,NOFORC	;NO STRING
30200		CAMG	TAC2,CUTLBS	;MAX # TARGET LIBS CUTOFF
30300		CAIL	SEARCH,177	;NO STRING
30400		JRST	NOFORC
30500		MOVEM	TAC2,TGLIBS	;SAVE # TARGET LIBS FOR PLAYFS
30600		MOVE	BWREG,TAC	;SET CONVENTIONAL VALUE FOR BWREG
30700		SKIPN	FORSAV
30800		JRST	FORCES+2
30900	
31000	;*****CONTINUE WITH SAVES
31100		MOVEM	TAC2,LIBSNO	;SET MAX # OF NEIGHBOR LIBERTIES
31200		CAIG	TAC2,1
31300		SETOM	SVCRIT		;ONLY ONE LIB IN TARGET STRING
31400		JRST	NFORC1
31500	
31600	;**********
31700	;      FORCES RETURNS UP TO FOUR MOVES TO CONSIDER AS FORCING MOVES AGAINST
31800	;THE SPECIFIED STRING DURING LADDER FORMATION. MOVES ARE RANKED IN ORDER OF
31900	;ESTIMATED USEFULNESS IN CAPTURING A TARGET STRING DURING LOCAL LOOKAHEAD.
32000	;**********
32100	FORCES:	SETZM	FORSAV
32200		JRST	SAVES+1
32300		CAIE	TAC2,1
32400		SOJ	TAC2,		;NEVER LET LIBSNO BE ZERO
32500		MOVEM	TAC2,LIBSNO		;MAX # OF NEIGHBOR LIBERTIES
32600	NFORC1:	PUSHJ	PDP,PLAYFS		;AFFMOV CONTAINS ALL RELEVANT PLAYS
32700		SKIPN	FORSAV
32800		JRST	NOFORC
32900		MOVEI	PDP,1
33000		MOVEM	PDP,KFOR	;NOT INSTANT SAVER
33100	NOFORC:	MOVE	PDP,PDPSAV
33200		MOVE	16,R16SAV
33300		SUB	PDP,[XWD 2,2]
33400		JRST	@2(PDP)
     

00100	BEGIN	NGHBLK
00200	
00300	;**********
00400	;	MARK THE STRINGS CONNECTED TO THE TARGET (INCLUDING THE TARGET)
00500	;IF REPLCE IS SET TO 4000000.  DELETE ANY STRINGS FROM THE LIST IF THEY
00600	;HAVE MORE THAN LBSCUT+2 LIBERTIES.  SAVE IN REGISTER "CLEAR" ANY STRING
00700	;(ENEMY) WHICH SHOWS UP AS ATARIED.
00800	;**********
00900		0			;HOLDS NAME OF CURRENT MOVE STRING
01000	MRKNGH:	MOVEI	TAC3,AFFSTR+1
01100		SETZ	CLEAR,		;HOLDS ATARIED ENEMY STRING NAME
01200	MRKNG1:	SKIPN	SEARCH,0(TAC3)
01300		POPJ	PDP,
01400		ANDI	SEARCH,177
01500		LDB	TAC1,[POINT 9,STRPTR(SEARCH),17]
01600		LDB	TAC4,[POINT 9,STRPTR(SEARCH),35]
01700		TDNN	FRIEND,GB1(TAC1)
01800		JRST	MRKNG3
01900		ORM	REPLCE,0(TAC3)		;CONNECTED TO CURRENT STRING
02000		CAME	SEARCH,MRKNGH-1
02100		JRST	MRKNG2			;NOT CURRENT STRING
02200		MOVE	TAC,TAC1		;SAVE CURRENT MOVE POINT
02300		MOVE	TAC1,STRPTR(SEARCH)
02400		TLNE	TAC1,3000
02500		AOJA	TAC3,MRKNG1		;CURENT STRNG WAS ENDANGERED ∨ DEAD
02600	MRKNG2:	CAIG	TAC4,LBSCUT+2
02700		AOJA	TAC3,MRKNG1		;SMALL-ENOUGH FRIENDLY STRING
02800		MOVE	TAC1,TAC3
02900		MOVE	TAC2,1(TAC1)		;THIS FRIENDLY STRING IS TOO LARGE,
03000		MOVEM	TAC2,0(TAC1)		;SO FORGET ABOUT IT
03100		JUMPE	TAC2,MRKNG2+1
03200		AOJA	TAC1,.-3
03300	MRKNG3:	CAIE	TAC4,1
03400		JRST	MRKNG2
03500		SKIPN	CLEAR
03600		SKIPA	CLEAR,SEARCH		;SAVE ENEMY ATARIED STRING NAME
03700		SETO	CLEAR,			;>1 ATARIED ENEMY STRING
03800		AOJA	TAC3,MRKNG1
03900	
04000	;**********
04100	;	COLLECT STRING NAMES FOR TACTICAL ANALYSIS IN GOEVAL
04200	;**********
04300	CLLSTR:	MOVEI	TAC3,AFFSTR+1
04400		MOVE	TAC1,BRDDPY		;HOLDS FRIENDLY STRING NAMES
04500		MOVE	TAC2,MSGDPY		;HOLDS ENEMY STRING NAMES
04600	CLLST1:	SKIPN	SEARCH,0(TAC3)
04700		JRST	CLLST3+1
04800		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
04900		TDNN	FRIEND,GB1(TAC)
05000		JRST	CLLST2
05100		MOVEM	SEARCH,0(TAC1)		;ANOTHER FRIENDLY
05200		AOJA	TAC1,CLLST3
05300	CLLST2:	MOVEM	SEARCH,0(TAC2)		;ANOTHER ENEMY
05400		AOJ	TAC2,
05500	CLLST3:	AOJA	TAC3,CLLST1
05600		SETZM	0(TAC1)
05700		SETZM	0(TAC2)
05800		POPJ	PDP,
05900	
06000	;**********
06100	;	GET ALL AFFECTED STRINGS OF ATTACKING (PLAYER WHO IS MOVING) STONES
06200	;INTO BRDDPY AND ALL AFFECTED ATTACKED STRINGS INTO MSGDPY.   AN AFFECTED
06300	;STRING HAS ≤4 LIBERTIES AND IS CONNECTED TO THE CURRENT STRING BY ZERO OR
06400	;MORE AFFECTED STRINGS.  NOTE THIS IS A FUNCTION PROCEDURE RETURNING ZERO
06500	;IF IT FINDS TOO MANY STRINGS.
06600	;**********
06700		0			;HOLDS FRIENDLY SIDE BIT
06800	↑NGHBOR:MOVE	REPLCE,STRPTR
06900		MOVEM	REPLCE,AFFSTR
07000		SETZM	EXMOVE			;HOLDS ENEMY OBVIOUS MOVE LOCATION
07100		SETZM	@BRDDPY			;ZERO FRIENDLY STRING STORAGE
07200		SETZM	@MSGDPY			;ZERO ENEMY STRING STORAGE
07300		SKIPE	SEARCH,-1(PDP)
07400		CAIL	SEARCH,177
07500		JRST	NOFORC+2
07600		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
07700		JUMPE	TAC,NOFORC+2
07800		MOVEI	FRIEND,BLKOCC+WHTOCC
07900		AND	FRIEND,GB1(TAC)
08000		MOVEM	FRIEND,NGHBOR-1		;SAVE FRIENDLY SIDE
08100		MOVEM	SEARCH,AFFSTR+1
08200		MOVEM	SEARCH,MRKNGH-1		;SAVE CURRENT STRING NAME
08300		SETZM	AFFSTR+2		;INITIALIZE TEMP STRING STORAGE
08400		MOVEI	TAC1,LBSCUT+2
08500		MOVEM	TAC1,LIBSNO		;LOOK FOR ≤LBSCUT+2 LIBERTIES
08600		MOVEI	TAC1,MAXSTR
08700		MOVEM	TAC1,BNDCNS		;LOOK FOR UP TO MAXSTR STRINGS
08800		PUSHJ	PDP,NEIGHS
08900		SKIPG	BNDCNS
09000		JRST	NGHBO4+1		;TOO MANY STRINGS EXIT
09100		HRLZI	REPLCE,4		;"CONNECTED-TO-FRIENDLY" MARK
09200		PUSHJ	PDP,MRKNGH
09300	;*****SPECIAL LOOP TO GET ENDANGERED OR DEAD FRIENDLY AND ALIVE OR
09400	;*****ENDANGERED ENEMY STRINGS AT IKKEN TOBI POINTS
09500		MOVEI	TAC2,3
09600	NGHBO1:	MOVE	TAC1,@GB1TST(TAC2)
09700		TRNN	TAC1,BNKOCC
09800		JRST	NGHBO3			;NEIGHBOR POINT NOT BLANK
09900		MOVE	TAC3,@G1IKKN(TAC2)
10000		TRNE	TAC3,BNKOCC+NONOCC
10100		JRST	NGHBO3			;BLANK OR OFF-EDGE POINT
10200		MOVEI	TAC1,177
10300		AND	TAC1,TAC3
10400		HLL	TAC3,STRPTR(TAC1)
10500		TDNN	TAC3,NGHBOR-1
10600		JRST	NGHBO2
10700		TLNE	TAC3,3000
10800		JRST	NGHBO3-1		;ENDANG OR DEAD FRIENDLY
10900		JRST	NGHBO3
11000	NGHBO2:	TLNN	TAC3,2000
11100		PUSHJ	PDP,ADDSTR+1		;ALIVE OR ENDANGERED ENEMY
11200	NGHBO3:	SOJGE	TAC2,NGHBO1
11300		PUSHJ	PDP,CLLSTR
11400	;*****SET UP CAPTURE EXCHANGE IF THERE IS ONE
11500		MOVE	FRIEND,NGHBOR-1
11600		MOVEM	CLEAR,NGHBOR-1	;SAVE POSSIBLE ATARIED ENEMY
11700		MOVE	SEARCH,-1(PDP)
11800		LDB	TAC4,[POINT 9,STRPTR(SEARCH),35]
11900		SOJG	TAC4,NGHBO5
12000		SETO	BWREG,		;FINDND USES THIS REGISTER
12100		PUSHJ	PDP,FINDND
12200		MOVE	TAC,REGSTR+4	;PROPOSED CAPTURE POINT
12300		PUSHJ	PDP,LIBEST
12400		SKIPLE	LIBVEC+1
12500		JRST	NGHBO4-1	;FOUND LEGAL CAPTURE
12600	;*****SET UP EXTENSION OF ATARIED STRING
12700	NGHBO5:	SKIPG	SEARCH,NGHBOR-1
12800		JRST	NGHBO4
12900		SETO	BWREG,
13000		PUSHJ	PDP,FINDND
13100		MOVE	TAC,REGSTR+4
13200		PUSHJ	PDP,LIBEST
13300		SOSLE	LIBVEC+1	;≤1 LIB FOR ENEMY?
13400		MOVEM	TAC,EXMOVE
13500	NGHBO4:	SKIPA	1,17			;FOUND SOME AFFECTED STRINGS
13600		SETZ	1,			;FOUND ZERO OR TOO MANY STRINGS
13700		JRST	NOFORC+2
13800	
13900	;**********
14000	;	NGHBR1 IS USED AFTER NGHBOR IN ORDER TO LOOK "BEHIND" STRINGS
14100	;AFFECTED BY THE CURRENT MOVE.  (CLEARLY, STRINGS WHICH CHANGE STATUS ARE
14200	;THE ONES AFFECTED, AND ANY STRINGS BEHIND THESE STRINGS COULD ALSO
14300	;BE AFFECTED.)  NOTE LADEVAL IN GOEVAL MARKS STRINGS "SEEN" AS IT
14400	;CHECKS STRING STATUS;
14500	;**********
14600		0			;HOLDS OLD END OF AFFECTED STRINGS
14700	↑NGHBR1:MOVEM	16,R16SAV
14800	;*****RESTORE AFFSTR FOR NEIGHS
14900		MOVE	REPLCE,STRPTR
15000		MOVEM	REPLCE,AFFSTR
15100		SETZ	TAC3,
15200		MOVE	TAC1,BRDDPY
15300		HRRM	TAC1,NGHBR2
15400	NGHBR2:	SKIPN	TAC4,0(TAC3)
15500		JRST	.+3			;NO MORE FRIENDLIES
15600		MOVEM	TAC4,AFFSTR+1(TAC3)
15700		AOJA	TAC3,.-3
15800		HRRZ	TAC1,NGHBR2
15900		CAME	TAC1,BRDDPY
16000		JRST	.+4
16100		MOVE	TAC1,MSGDPY
16200		SUB	TAC1,TAC3
16300		JRST	NGHBR2-1
16400		MOVE	FRIEND,NGHBOR-1
16500		SETZM	AFFSTR+1(TAC3)		;MARK END OF STRINGS LIST
16600		MOVEM	TAC3,NGHBR1-1		;SAVE OLD END OF STRINGS LIST
16700		SUBI	TAC3,MAXSTR+1
16800		MOVNM	TAC3,BNDCNS
16900		MOVEI	TAC3,LBSCUT+2
17000		MOVEM	TAC3,LIBSNO
17100	;*****EXPAND BEHIND AFFECTED STRINGS
17200		MOVEI	16,AFFSTR+1
17300	NGHBR3:	SKIPN	SEARCH,0(16)
17400		JRST	NGHBR4
17500		TLZN	SEARCH,2
17600		AOJA	16,NGHBR3
17700		MOVEM	SEARCH,0(16)
17800		PUSHJ	PDP,NEIGHS
17900		SKIPG	BNDCNS
18000		JRST	NGHBR5
18100		AOJA	16,NGHBR3
18200	NGHBR4:	SETZ	REPLCE,
18300		PUSHJ	PDP,MRKNGH
18400		MOVE	TAC1,NGHBR1-1
18500		SKIPN	AFFSTR+1(TAC1)
18600	NGHBR5:	TDZA	1,1		;NO NEW STRINGS OR TOO MANY STRINGS
18700		PUSHJ	PDP,CLLSTR
18800		MOVE	16,R16SAV
18900		POPJ	PDP,
19000	
19100	BEND
19200	
19300	
19400	;**********ADD IN NEW STRING NAME, IF NOT DUPLICATED
19500	ADDSTR:	LDB	TAC1,[POINT 7,@GB1TST(TAC2),35]		;ENEMY NAME
19600		SKIPN	TAC4,LIBSNO
19700		JRST	CAPADD
19800		LDB	TAC5,[POINT 9,STRPTR(TAC1),35]		;ENEMY LIBS
19900		CAMLE	TAC5,TAC4
20000		POPJ	PDP,
20100		SETZ	TAC4,			      ;SEARCH FOR PRIOR OCCURRENCE
20200	CAPADD:	SKIPG	TAC5,AFFSTR(TAC4)
20300		JRST	.+4
20400		CAIE	TAC1,0(TAC5)
20500		AOJA	TAC4,.-3
20600		POPJ	PDP,
20700		MOVEM	TAC1,AFFSTR(TAC4)
20800		SETZM	AFFSTR+1(TAC4)
20900		SOS	BNDCNS
21000		POPJ	PDP,
21100	
21200	;**********
21300	;	COUNT THE NUMBER AND SAVE THE NAMES OF STRINGS ADJACENT TO STRING
21400	;"SEARCH" WHICH HAVE ≤ NUMBER OF LIBERTIES SPECIFIED IN "LIBSNO".  IF
21500	;LIBSNO=0, THEN GET ALL STRINGS.  AFFSTR, FRIEND, BNDCNS, SEARCH, LIBSNO
21600	;MUST BE SET EXTERNALLY. IF SEARCH IS CONNECTED TO FRIENDLY THROUGH FALSE
21700	;(OR REAL) EYE, COUNT THESE FRIENDLY STRINGS IN, TOO.
21800	;**********
21900		0
22000	NEIGHS:	MOVE	TAC1,STRPTR(SEARCH)
22100		MOVEM	FRIEND,NEIGHS-1
22200		TRNN	TAC1,776
22300		SETZ	FRIEND,		;ONE-LIB STRING CANT CONNECT TO FRIENDLIES
22400		PUSHJ	PDP,STRSET
22500		MOVE	TAC1,[PUSHJ PDP,CAPSTR]
22600		MOVEM	TAC1,DRIVR1-3
22700		SETZM	NOCONS		;COUNTS # CONNECTION POINTS
22800		MOVEI	ENEMY,BLKOCC+WHTOCC
22900		TDZ	ENEMY,GB1(TAC)
23000		PUSHJ	PDP,CAPSTR
23100		MOVE	FRIEND,NEIGHS-1
23200	;*****GET RID OF POSSIBLE DUPLICATE CONNECTION COUNTS
23300		HRRZ	TAC1,NOCONS	;# CONNECTIONS
23400		HLRZ	TAC2,NOCONS	;# STRING STONES AT CONNECTIONS
23500		SUB	TAC2,TAC1
23600		LSH	TAC2,-1
23700		SUB	TAC1,TAC2
23800		MOVEM	TAC1,NOCONS
23900		POPJ	PDP,
24000	
24100	CAPSTR:	SKIPG	BNDCNS
24200		JRST	ADLEND+1		;MORE-THAN-20 CUTOFF
24300		MOVEI	TAC2,3
24400	CAPST1:	JUMPE	FRIEND,CAPEND-2	;DONT LOOK FOR CONNECTIONS
24500		TDNN	BLANK,@GB1TST(TAC2)
24600		JRST	CAPEND-2	;NOT BLANK POINT
24700		MOVEI	TAC1,NGHBTS*(WHTNGH+BLKNGH)
24800		AND	TAC1,@GBDTST(TAC2)
24900		CAIE	ENEMY,WHTOCC
25000		TRZA	TAC1,BLKNGH*NGHBTS
25100		LSH	TAC1,-4
25200		SOJLE	TAC1,CAPEND	;LESS THAN TWO NEIGHS
25300		MOVEI	TAC,@GODOWN(TAC2)
25400		MOVEI	TAC3,3
25500		SETZM	CONPNT+5	;HOLDS "CONNECTED" 1-LIB STRING
25600	CAPST2:	LDB	TAC5,[POINT 7,@GB1TST(TAC3),35]
25700		SETZM	CONPNT(TAC3)
25800		CAIN	TAC5,177
25900		AOJA	TAC1,CAPST3	;ADD NEIGH FOR OFF-EDGE POINT
26000		JUMPE	TAC5,CAPST3
26100		CAMN	TAC5,SEARCH
26200		MOVE	TAC5,REPLCE	;"SEARCH" IS DUMMY NAME
26300		HRRZ	TAC4,STRPTR(TAC5)
26400		TDNN	ENEMY,@GB1TST(TAC3)
26500		JRST	CAPST4
26600		TRNN	TAC4,776
26700		AOJA	TAC1,CAPST3	;ADD NEIGH FOR ATARIED ENEMY
26800		SUBI	TAC1,=100	;CANT BE A TIGERMOUTH CONNECTION
26900		JRST	CAPST3
27000	CAPST4:	TRNN	TAC4,776
27100		JRST	.+3
27200		MOVEM	TAC5,CONPNT(TAC3)
27300		JRST	CAPST3-2
27400		SKIPE	CONPNT+5
27500		JRST	CAPEND-3	;TWO ATARIED STRINGS, NO CONNECTION
27600		MOVEM	TAC5,CONPNT+5	;SAVE ATARIED STRING NAME
27700		SOJ	TAC1,		;SUB NEIGH FOR ATARIED FRIEND
27800		TRNN	TAC4,776000
27900		SUBI	TAC1,=100	;THIS IS AT BEST A KO, NOT A CONNECTION
28000		CAMN	REPLCE,TAC5
28100		SETOM	CONPNT(TAC3)	;MARK CURRENT STRING LOCATION
28200	CAPST3:	SOJGE	TAC3,CAPST2
28300		CAIL	TAC1,2
28400		JRST	CAPST5+1	;GOT CONNECTION
28500		MOVE	TAC3,CONPNT
28600		MOVEM	TAC3,CONPNT+4
28700		MOVE	TAC3,CONPNT+3
28800		MOVEM	TAC3,CONPNT-1
28900		MOVEI	TAC1,3
29000	CAPST6:	SKIPG	CONPNT(TAC1)
29100		JRST	CAPST5
29200		SKIPL	CONPNT+1(TAC1)
29300		JRST	.+3
29400		TDNE	BLANK,@G1DIAG+1(TAC1)
29500		JRST	CAPST5		;THIS IS DIAGONALLY CONNECTED
29600		SKIPGE	CONPNT-1(TAC1)
29700		TDNN	BLANK,@G1DIAG(TAC1)
29800		SETZM	CONPNT(TAC1)	;THIS STRING NOT CONNECTED
29900	CAPST5:	SOJGE	TAC1,CAPST6
30000		SKIPE	TAC1,CONPNT+5
30100		PUSHJ	PDP,CAPADD-1	;CONSIDER ATARIED STRING "CONNECTED"
30200		SETZ	TAC4,
30300		MOVEI	TAC3,3
30400		SKIPLE	TAC1,CONPNT(TAC3)
30500		PUSHJ	PDP,CAPADD-1
30600		SOJGE	TAC3,.-2
30700		JUMPE	TAC4,CAPST7
30800		AOS	NOCONS		;A CONNECTION WAS FOUND
30900		HRLZI	TAC4,1
31000		MOVEI	TAC3,3
31100		SKIPGE	CONPNT(TAC3)
31200		ADDM	TAC4,NOCONS	;# STRING STONES AT CONNECTION
31300		SOJGE	TAC3,.-2
31400	CAPST7:	MOVEI	TAC,@GODOWN+2(TAC2)
31500		TDNE	ENEMY,@GB1TST(TAC2)
31600		PUSHJ	PDP,ADDSTR
31700	CAPEND:	SOJGE	TAC2,CAPST1
31800		JRST	ADLEND+1
31900	
32000	;**********
32100	;	SAVE THE LOCATIONS OF LIBERTIES OF THE STRING "SEARCH".
32200	;BNDCNL AND SEARCH MUST BE SET EXTERNALLY.
32300	;**********
32400	LBSGET:	SETZ	FRIEND,			;USED BY PLAYFS
32500		PUSHJ	PDP,STRSET
32600		LDB	TAC5,[POINT 9,STRPTR(REPLCE),35]
32700		MOVEM	TAC5,NOLIBS		;# LIBERTIES IN STRING
32800		MOVE	TAC1,[PUSHJ PDP,LIBSTR]
32900		MOVEM	TAC1,DRIVR1-3
33000	LIBSTR:	JUMPE	TAC5,ADLEND+1		;ARE THERE MORE LIBS
33100		SKIPG	BNDCNL
33200		JRST	ADLEND+1
33300		MOVEI	TAC2,3
33400		TDNN	BLANK,@GB1TST(TAC2)
33500		JRST	LIBNDR
33600		MOVEI	TAC1,@GODOWN(TAC2)	;LOCATION OF BLANK
33700		MOVEI	TAC3,AFFMOV
33800		SKIPN	TAC4,0(TAC3)
33900		JRST	LIBADD
34000		CAIE	TAC1,0(TAC4)		;SEEN THIS ONE YET?
34100		AOJA	TAC3,.-3
34200		JRST	LIBNDR-2
34300	LIBADD:	SOS	BNDCNL			;REDUCE # AVAILABLE LIBERTY SLOTS
34400		PUSHJ	PDP,TACMR1
34500		MOVEM	TAC1,0(TAC3)		;SAVE LIB LOCATION
34600		SETZM	1(TAC3)
34700		SOJ	TAC5,			;SUBTRACT ONE LIB COUNT
34800		ORM	FRIEND,0(TAC3)		;NEXT TO TARGET, NEXT TO CHASER
34900		JUMPE	TAC5,ADLEND+1		;JUMP IF NO MORE LIBS
35000	LIBNDR:	SOJGE	TAC2,LIBSTR+4
35100		JRST	ADLEND+1
35200	
35300	;**********
35400	;	FIND THE OTHER END OF THE TWO-LIB STRING WE HAVE JUST ATTACKED.
35500	;THIS OTHER LIBERTY WILL BE EXAMINED TO SEE IF THE PROPOSED MOVE IS IN FACT
35600	;A FORCED CAPTURE.
35700	;**********
35800	FINDND:	PUSHJ	PDP,STRSET
35900		MOVE	TAC1,[PUSHJ PDP,FNDEND]
36000		MOVEM	TAC1,DRIVR1-3
36100		SETZM	REGSTR+4
36200	FNDEND:	SKIPE	REGSTR+4
36300		JRST	ADLEND+1
36400		MOVEI	TAC1,3
36500		TDNN	BLANK,@GB1TST(TAC1)
36600		JRST	FNDEN1
36700		MOVEI	TAC2,@GODOWN(TAC1)
36800		CAIN	TAC2,0(BWREG)		;IS THIS THE CURRENT MOVE WE
36900		JRST	FNDEN1			;ARE JUST PROPOSING?
37000		MOVEM	TAC2,REGSTR+4	;SAVE OTHER END BLANK ADDRESS
37100		ADDI	TAC1,2
37200		CAIL	TAC1,4
37300		SUBI	TAC1,4
37400		MOVEM	TAC1,REGSTR+5
37500		JRST	ADLEND+1
37600	FNDEN1:	SOJGE	TAC1,FNDEND+3
37700		JRST	ADLEND+1
37800	
37900	;**********
38000	;	SETS UP FOR RECURSION ON STRINGS.  THIS ROUTINE IS COMMON TO
38100	;ALMOST EVERY STRING-PROCESSING FUNCTION IN THE PROGRAM.
38200	;**********
38300	STRSET:	MOVEI	BLANK,BNKOCC
38400		SKIPN	REPLCE,STRPTR
38500		SAILERR <1>		;******** ERROR MESSAGE 1 ********
38600		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]	;GET BASE POINT
38700		CAIL	TAC,BRDWTH
38800		CAIL	TAC,BRDWTH*(BRDWTH-1)
38900		SAILERR <2>		;******** ERROR MESSAGE 2 ********
39000		MOVEM	TAC,TACSAV
39100		MOVEI	CLEAR,STRBTS*STRCNT
39200		PUSHJ	PDP,DRIVER		;MARK STRING POINTS
39300		EXCH	SEARCH,REPLCE
39400		MOVE	TAC,TACSAV
39500		POPJ	PDP,
     

00100	;*********
00200	;	HANDLE THE CASE WHERE THE FORCING SIDE WANTS TO PLAY NEXT
00300	;TO A SELF-ATARI POINT SO THAT HE CAN THEN PLAY ON THE SELF-ATARI
00400	;POINT NEXT TIME.  THERE ARE TWO CASES...
00500	;	1.  PLAYING ON SELF-ATARI POINT ENDANGERS FORCER STONES
00600	;	2.  PLAYING ON SELF-ATARI POINT CAN LOSE ONLY ONE STONE
00700	;*********
00800	CONSTR:	TLNN	BWREG,CONTGT+NXTTGT
00900		JRST	NONIL1		;POINT DOES NOT AFFECT TARGET
01000		SKIPN	TAC3,FSLIBS+4
01100		JRST	CNSTR2		;NO TWO-LIB FORCERS
01200		CAILE	TAC3,177
01300		JRST	NONIL1		;MORE THAN ONE TWO-LIB FORCER
01400	;*****MAKE SURE STRING IS ON THE AFFECTED STRINGS LIST
01500		MOVEI	TAC1,AFFSTR+1
01600		HRRZ	TAC4,0(TAC1)
01700		JUMPE	TAC4,REPLAY-3	;FORCER STRING NOT ON AFFECTED LIST
01800		CAME	TAC3,TAC4
01900		AOJA	TAC1,.-3
02000	;*****FIND LIBERTY AT "OTHER END" OF THIS STRING
02100		MOVEI	TAC1,AFFMOV
02200	CNSTR1:	HRRZ	TAC,0(TAC1)
02300		JUMPE	TAC,CNSTR4	;THIS SHOULD BE VERY RARE
02400		CAIN	TAC,0(BWREG)
02500		AOJA	TAC1,CNSTR1	;CURRENT POINT
02600		MOVEI	TAC5,3
02700		LDB	REPLCE,[POINT 7,@GB1TST(TAC5),35]
02800		CAMN	TAC3,REPLCE
02900		JRST	CNSTR3		;FOUND OTHER END OF STRING
03000		SOJGE	TAC5,.-3
03100		AOJA	TAC1,CNSTR1
03200	;*****TAKE CARE OF CASE 2...
03300	CNSTR2:	SKIPE	FSLIBS+3
03400		JRST	NONIL1		;NEXT TO ATARIED STRING
03500		MOVEI	BLANK,BNKOCC
03600		MOVEI	TAC1,3
03700		TDNE	BLANK,@GB1TST(TAC1)
03800		JRST	CNST22
03900		SOJGE	TAC1,.-2
04000		TLNN	BWREG,CAPENM
04100		SAILERR <3>		;IMPOSSIBLE ******* ERROR MESSAGE 3 *******
04200		JRST	NONIL1
04300	CNST22:	MOVEI	TAC,@GODOWN(TAC1)
04400	;*****FIND WHICH PROPOSED MOVE HELPS PLAY AT SELF-ATARI POINT
04500		MOVEI	TAC1,AFFMOV
04600		SKIPN	TAC4,0(TAC1)
04700		JRST	CNSTR4
04800		CAIE	TAC,0(TAC4)
04900		AOJA	TAC1,.-3
05000	CNSTR3:	MOVEI	TAC5,HLPSTR	;SET POSSIBLE HELPER BIT
05100		ORM	TAC5,AUXBTS-AFFMOV(TAC1)
05200		HRRZ	TAC,BWREG
05300		JRST	NONIL1
05400	CNSTR4:	MOVEM	TAC,0(TAC1)
05500		SETZM	1(TAC1)
05600		SOSG	BNDCNL
05700		JRST	LEXCSS
05800		PUSHJ	PDP,TACMRK
05900		JRST	CNSTR3
06000	
06100	;**********
06200	;	A NEW WEAK NON-TARGET STRING HAS BEEN FOUND, SO RESTART THE
06300	;PREDICTION ANALYSIS AFTER INCLUDING THE NEW STRING.
06400	;**********
06500		MOVE	TAC,TAC1
06600		MOVE	SEARCH,TAC3
06700		JRST	REPLAY+3
06800	REPLAY:	MOVEI	TAC,AFFSTR+2	;WE HAVE JUST FOUND ANOTHER WEAK CHASING
06900		SKIPE	0(TAC)		;STRING, SO MUST START OVER AT ENMYCP WITH
07000		AOJA	TAC,.-1		;THIS ADDITION TO AFFECTED STRINGS LIST
07100		SOSG	BNDCNS
07200		JRST	SEXCSS		;TOO MANY STRINGS
07300		MOVEM	SEARCH,0(TAC)
07400		SETZM	1(TAC)
07500		AOJ	TAC,		;MAKE SURE NEW STRING WILL BE WKNTGT
07600		HRRM	TAC,CONREC	;ALLOW THIS WKNTGT TO COLLECT NEIGHBORS
07700		MOVEI	TAC1,AFFMOV	;RESET PROPOSED MOVE BITS TO INITIAL STATE
07800		HRLOI	TAC2,WKNTGT+NXTTGT+CONTGT
07900		SKIPN	0(TAC1)
08000		JRST	ENMYCP-1
08100		SKIPGE	0(TAC1)
08200		SOS	BNDCNL		;ILLEGAL MOVE IS TEMPORARILY LEGAL AGAIN
08300		ANDM	TAC2,0(TAC1)
08400		AOJA	TAC1,.-5
08500	
08600	;**********
08700	;	THIS ABNORMAL EXIT CODE IS USED TO STOP THE ANALYSIS WHEN AN
08800	;EXCEPTIONAL CONDITION IS FOUND.  THE IDEA IS TO IDENTIFY THE EXCEPTION
08900	;BY THE POINT IT OCCURS AT AND/OR THE CODE NUMBER OF WHAT HAPPENED.
09000	;**********
09100	LEXCSS:	SKIPA	TAC5,[-6]
09200	SEXCSS:	MOVNI	TAC5,5
09300		MOVEM	TAC5,KFOR
09400		POP	PDP,ZER
09500		JRST	NOFORC
09600	STOPIT:	HRRZM	BWREG,IFORCE	;SAVE MOVE ADDRESS
09700		JRST	SEXCSS+1
09800	
09900	;*****CHECK STRING NAME TO SEE IF IT IS NEW TO THE TARGET COMPLEX.  IF
10000	;*****SO, ADD STRING NAME TO NWSTRG AND RETURN TAC4≠0.  NOTE SEARCH
10100	;*****MUST HAVE STRING NAME IN IT.
10200	NWSTRG:	BLOCK	11
10300	NEWSTR:	MOVEI	TAC4,1
10400		SKIPN	AFFSTR(TAC4)
10500		JRST	NEWST1+1
10600		CAME	SEARCH,AFFSTR(TAC4)
10700		AOJA	TAC4,.-3
10800		SETZ	TAC4,
10900	NEWST1:	POPJ	PDP,
11000		MOVEI	TAC4,NWSTRG
11100		SKIPN	0(TAC4)
11200		JRST	.+5
11300		CAMN	SEARCH,0(TAC4)
11400		JRST	NEWST1-1
11500		CAIE	TAC4,NWSTRG+7
11600		AOJA	TAC4,NEWST1+2
11700		MOVEM	SEARCH,0(TAC4)
11800		SETZM	1(TAC4)
11900		JRST	NEWST1
12000	
12100	;**********
12200	;	THE IDEA HERE IS TO ESTIMATE THE NUMBER OF LIBERTIES A
12300	;CAPTURE OF THE STRING "SEARCH" WOULD ADD.  IT IS IMPORTANT TO
12400	;INCLUDE LIBERTIES OF ALL STRINGS WHICH WOULD BECOME CONNECTED
12500	;THROUGH THE CAPTURE (BUT WHICH ARE NOT ALREADY CONNECTED).
12600	;**********
12700	NEWADD:	MOVEI	TAC2,3
12800		TDNN	BLANK,@GB1TST(TAC2)
12900		JRST	NEWAD1
13000		MOVEI	TAC,@GODOWN(TAC2)
13100		CAIN	TAC,0(BWREG)
13200		JRST	NEWAD1-1		;THIS IS CURRENT MOVE POINT
13300		MOVE	TAC3,TGLIBS
13400		HRRZ	TAC1,AFFMOV-1(TAC3)
13500		CAIN	TAC1,0(TAC)
13600		JRST	NEWAD1-1	;BLANK POINT ALREADY NXTTGT
13700		SOJG	TAC3,.-3
13800		MOVEM	TAC2,TEMP2
13900		MOVEI	TAC2,3
14000	NEWAD2:	MOVE	TAC1,@GB1TST(TAC2)
14100		TRNE	TAC1,BNKOCC
14200		AOS	NOLIBS		;BLANK NEXT TO BLANK
14300		TRNN	TAC1,BLKOCC+WHTOCC
14400		JRST	NEWAD4
14500		ANDI	TAC1,177
14600		LDB	TAC3,[POINT 9,STRPTR(TAC1),35]
14700		TDNE	ENEMY,@GB1TST(TAC2)
14800		JRST	NEWAD3
14900		CAME	TAC1,SEARCH	;CURRENT STRING?
15000		CAMN	TAC1,REPLCE
15100		JRST	NEWAD4
15200		CAILE	TAC3,2
15300		JRST	NEWAD4
15400		SOJG	TAC3,NEWAD2+2	;THREAT
15500		LDB	TAC3,[POINT 9,STRPTR(TAC1),26]
15600		JRST	NEWAD4-1	;CAPTURES ANOTHER STRING ALSO
15700	NEWAD3:	SOJLE	TAC3,NEWAD4		;ELIM 1-LIB STRINGS
15800		EXCH	SEARCH,TAC1
15900		PUSHJ	PDP,NEWSTR
16000		EXCH	SEARCH,TAC1
16100		SKIPN	TAC4
16200		SOSA	NOLIBS			;NOT NEW STRING
16300		ADDM	TAC3,NOLIBS
16400	NEWAD4:	SOJGE	TAC2,NEWAD2
16500		MOVE	TAC2,TEMP2
16600		MOVEI	TAC,@GODOWN+2(TAC2)
16700	NEWAD1:	TDNN	ENEMY,@GB1TST(TAC2)
16800		JRST	NEWAD5
16900		LDB	TAC1,[POINT 7,@GB1TST(TAC2),35]
17000		LDB	TAC3,[POINT 9,STRPTR(TAC1),35]
17100		SOJLE	TAC3,NEWAD5		;ELIM 1-LIB STRINGS
17200		EXCH	SEARCH,TAC1
17300		PUSHJ	PDP,NEWSTR
17400		EXCH	SEARCH,TAC1
17500		SKIPE	TAC4
17600		ADDM	TAC3,NOLIBS
17700	NEWAD5:	SOJGE	TAC2,NEWADD+1
17800		JRST	ADLEND+1
17900	
18000	;*****SETUP CODE FOR THE NEWADD LEAF
18100	NOCAPW:	SETZM	NOLIBS		;HOLDS # LIBS FOUND
18200		PUSHJ	PDP,STRSET
18300		MOVE	TAC1,[PUSHJ PDP,NEWADD]
18400		MOVEM	TAC1,DRIVR1-3
18500		MOVEI	ENEMY,BLKOCC+WHTOCC
18600		TDZ	ENEMY,GB1(TAC)
18700		MOVEI	TAC1,NWSTRG
18800		SKIPE	0(TAC1)
18900		AOJA	TAC1,.-1
19000		HRRM	TAC1,.+2	;SAVE LOCATION OF END OF NEW STRINGS LIST
19100		PUSHJ	PDP,NEWADD
19200		SETZM	0		;GET RID OF ANY NEW NEW STRINGS
19300		POPJ	PDP,
19400	
19500	;**********
19600	;	MARK GBOARD POINT AS PART OF THE TACTICAL ANALYSIS.  WE EXPECT
19700	;TAC TO CONTAIN THE ADDRESS OF THE POINT TO BE MARKED.
19800	;**********
19900		TACBIT
20000	TACMRK:	SKIPN	STRRST
20100		POPJ	PDP,		;DONT MARK NOW
20200		EXCH	TAC3,TACMRK-1
20300		ORM	TAC3,GBOARD(TAC)
20400		EXCH	TAC3,TACMRK-1
20500		POPJ	PDP,
20600	TACMR1:	SKIPN	STRRST
20700		POPJ	PDP,		;DONT MARK NOW
20800		EXCH	TAC3,TACMRK-1
20900		ORM	TAC3,GBOARD(TAC1)
21000		EXCH	TAC3,TACMRK-1
21100		POPJ	PDP,
21200	
21300	;**********
21400	;	FIND NXTTGT ∨ CONTGT POINT ADJACENT TO THE CURRENT POINT.  NOTE THE
21500	;CONTGT POINT CANT BE A "NEW" CONTGT.  IF TAC5≠0 THEN SUCCESS.
21600	;**********
21700	NXCSRC:	MOVEI	TAC4,AFFMOV
21800		SKIPN	TAC5,0(TAC4)
21900		POPJ	PDP,		;FAILURE RETURN
22000		TLNN	TAC5,NXTTGT+CONTGT
22100		AOJA	TAC4,NXCSRC+1
22200		HLL	TAC5,AUXBTS-AFFMOV(TAC4)
22300		TLNE	TAC5,NEWCGT
22400		AOJA	TAC4,NXCSRC+1
22500		HRRZ	TAC5,TAC5
22600		SUB	TAC5,TAC
22700		MOVM	TAC5,TAC5
22800		CAIE	TAC5,BRDWTH
22900		CAIN	TAC5,1
23000		POPJ	PDP,
23100		AOJA	TAC4,NXCSRC+1
     

00100	BEGIN LADRES
00200	
00300	;**********
00400	;	CHECK A CAPTURED STRING TO SEE IF THIS CAPTURE SAVES SOME
00500	;FRIENDLY STRING ON THE OTHER SIDE OF THE CAPTURE.  SEARCH IS NAME OF
00600	;CAPTURED STRING, FRIEND IS SET TO CAPTURING SIDE.  TAC3 MUST BE SET
00700	;TO (# STRING LIBS) - 1.
00800	;NOLIBS=0 MEANS THIS MOVE CONCERNS THE AFFECTED STRINGS LIST.
00900	;IF TEMP1≠0 THEN SAVING DIDNT HAPPEN ... TEMP1>0 MEANS ANOTHER WEAKER
01000	;STRING NEARBY, TEMP1<0 MEANS NO WEAK STRINGS AROUND.  RIGHT HALF OF
01100	;TEMP3 HOLDS THE NAME OF THE SAVED STRING, IF ANY.
01200	;**********
01300	NEIGH1:	PUSHJ	PDP,STRSET+1
01400		MOVE	TAC1,[PUSHJ PDP,CNTSTR]
01500		MOVEM	TAC1,DRIVR1-3
01600		SETOM	TEMP1
01700		SETZM	TEMP3
01800		SETOM	NOLIBS
01900		TLNE	BWREG,NXTTGT+CONTGT
02000		SETZM	NOLIBS
02100	CNTSTR:	MOVEI	TAC1,3
02200		TDNN	FRIEND,@GB1TST(TAC1)
02300		JRST	CNTST1
02400		LDB	TAC2,[POINT 7,@GB1TST(TAC1),35]
02500		HRRZ	TAC5,CONREC	;ADDR PAST END OF RELEVANT STRINGS
02600		SUBI	TAC5,AFFSTR+1
02700		CAMN	TAC2,AFFSTR(TAC5)
02800		SETZM	NOLIBS		;TARGET COMPLEX STRING AFFECTED
02900		SOJG	TAC5,.-2
03000	CNTST3:	LDB	TAC4,[POINT 9,STRPTR(TAC2),35]
03100		CAILE	TAC4,2
03200		JRST	CNTST1
03300		CAIGE	TAC4,1(TAC3)	;IS THIS SURROUNDING STRING TOO WEAK
03400		MOVEM	TAC,TEMP1	;*** THIS IS THE FAILURE CASE.
03500		SOJG	TAC4,CNTST4	;TWOLIBBER CANT BECOME AN EYE
03600		HRRM	TAC2,TEMP3	;ATARIED STRING SAVED
03700	CNTST4:	SKIPL	TEMP1
03800		JRST	CNTST1		;DONT DESTROY FAILURE MARK
03900		CAMN	TAC3,TAC4
04000		SETZM	TEMP1
04100	CNTST1:	SOJGE	TAC1,CNTSTR+1
04200		JRST	ADLEND+1
04300	
04400	;**********
04500	;	IF STRING SEARCH CANT ESCAPE BY CAPTURING A NEIGHBORING
04600	;STRING, ADD ITS STONES TO THE NUMBER OF CAPTURES.
04700	;**********
04800	LADADD:	MOVEM	TAC4,REGSTR+11
04900		PUSHJ	PDP,NEIGH1
05000		SKIPLE	TEMP1
05100		JRST	.+3		;STRING CAN GET AWAY
05200		LDB	TAC5,[POINT 9,STRPTR(REPLCE),26]
05300		ADDM	TAC5,REGSTR+10	;INCREASE THE "BAG"
05400		MOVE	TAC,REGSTR+4
05500		SKIPN	TAC1,REGSTR+5
05600		MOVEI	TAC1,4
05700		MOVE	TAC4,REGSTR+11
05800		POPJ	PDP,
05900	
06000	;**********
06100	;	THIS ROUTINE ADDS TO TAC4 THE NUMBER OF LIBERTIES GAINED BY THE
06200	;TARGET STRING WHEN IT PLAYS NEXT TO ANOTHER STRING
06300	;**********
06400		0			;HOLDS # ATARIED FRIENDLIES
06500	ENMCNT:	TDNE	REPLCE,FRIEND
06600		JRST	FRDCNT
06700		ANDI	REPLCE,177
06800		CAME	REPLCE,BLANK
06900		CAMN	REPLCE,CLEAR
07000		JRST	ENMCN1-1	;THESE LIBS ALREADY COUNTED
07100		CAMN	REPLCE,REGSTR+6
07200		JRST	ENMCN1-1	;THIS IS TARGET STRING
07300		LDB	TAC3,[POINT 9,STRPTR(REPLCE),35]
07400		SKIPE	ZER
07500		PUSHJ	PDP,LIBFIX
07600		SOJG	TAC3,ENMCN1
07700		MOVE	SEARCH,REPLCE
07800		PUSHJ	PDP,LADADD	;ADD ANY STONES WHICH WILL ALSO GET CAPTURED
07900		TDZA	TAC3,TAC3
08000	ENMCN1:	ADD	TAC4,TAC3
08100		POPJ	PDP,
08200	FRDCNT:	ANDI	REPLCE,177
08300		HRRZ	TAC3,STRPTR(REPLCE)
08400		SKIPN	ZER
08500		PUSHJ	PDP,LIBFIX
08600		TRNE	TAC3,776
08700		JRST	FRDCN1
08800		LSH	TAC3,=-9	;# CAPTURED FRIENDLY STONES
08900		JRST	ENMCN1
09000	FRDCN1:	TRNE	TAC3,775
09100		JRST	ENMCN1-1	;FRIENDLY HAS ≥2 LIBS
09200		LSH	TAC3,-=9
09300		ADDM	TAC3,ENMCNT-1	;HOLDS # ATARIED FRIENDLIES
09400		JRST	ENMCN1-1
09500	LIBFIX:	MOVEI	TAC5,GRUPNO	;WHEN STRING IS NEXT TO ENEMY PROPOSED MOVE
09600		SKIPN	0(TAC5)		;IT HAS ONE FEWER LIB THAN IS RECORDED IN
09700		POPJ	PDP,		;THE STRING DATA
09800		CAME	REPLCE,0(TAC5)
09900		AOJA	TAC5,.-3
10000		SUBI	TAC3,1		;STRING NEXT TO PROPOSED CHASER MOVE
10100		POPJ	PDP,
10200	
10300	;**********
10400	;	ERASE 7-BIT ASCII NAME (IN SEARCH) FROM TAC4.  NOTE TAC1 AND
10500	;TAC5 ARE DESTROYED AND PROGRAM BLOWS UP IF SEARCH NOT IN TAC4.
10600	;**********
10700	DELNAM:	MOVEI	TAC1,177
10800		AND	TAC1,TAC4
10900		LSHC	TAC4,-7		;SAVE PART OF TAC4 IN TAC5
11000		CAMN	SEARCH,TAC1
11100		JRST	DELNA1
11200		PUSHJ	PDP,DELNAM
11300		LSHC	TAC4,7
11400		POPJ	PDP,
11500	DELNA1:	LSH	TAC5,7		;DESTROY LAST NAME SAVED
11600		POPJ	PDP,
11700	
11800	;**********
11900	;	THIS CODE LOOKS ALONG THE EDGE OF THE BOARD TO SEE IF THERE IS
12000	;A FORCED CAPTURE POSSIBLE BY RUNNING THE STRING BEING CHASED INTO THE
12100	;CORNER OR INTO SOME OTHER CHASING STONES.
12200	;**********
12300	TRYEDG:	HRRE	TAC4,GODOWN+2(TAC1)
12400		SKIPN	REGSTR+7
12500		MOVEI	TAC3,3(TAC1)		;REGISTERS NOT SWAPPED
12600		SKIPE	REGSTR+7
12700		MOVEI	TAC3,1(TAC1)		;REGS SWAPPED
12800		CAIL	TAC3,4
12900		SUBI	TAC3,4
13000		ADD	TAC,TAC4
13100	;**********
13200	;	LOOK ALONG THE EDGE OF THE BOARD TO SEE IF THERE IS A LADDER.
13300	;NOTE TAC, ENEMY, FRIEND, TAC3, AND TAC4 MUST BE PRESET.
13400	;*********
13500	EDGLAD:	MOVE	SEARCH,GB1(TAC)		;LOOK AT LINE 1 POINT
13600		TRNE	SEARCH,NONOCC
13700		JRST	CAPTUR			;LADDER WORKED
13800		TRNE	SEARCH,BNKOCC
13900		JRST	EABLNK			;LINE 1 POINT IS BLANK
14000		MOVE	TAC1,SEARCH
14100		ANDI	SEARCH,177
14200		LDB	TAC5,[POINT 9,STRPTR(SEARCH),35]
14300		TDNE	TAC1,FRIEND
14400		JRST	EGOODG
14500		CAILE	TAC5,2
14600		JRST	NOTLAD		;STRING SAVED BY FRIENDLY
14700		CAIG	TAC5,1
14800		JRST	CAPTUR		;LADDER WORKED
14900		JRST	NOGOOD		;CANT TELL IF WORKED OR NOT
15000	EGOODG:	CAILE	TAC5,1
15100		JRST	CAPTUR		;LADDER WORKED
15200		MOVE	SEARCH,@GB1TST(TAC3)	;SEE IF CAPTURED FRIENDLY CAN
15300		TDNN	SEARCH,ENEMY		;PERHAPS NOT BE DISCOURAGING
15400		JRST	NOTLAD
15500		ANDI	SEARCH,177
15600		LDB	TAC5,[POINT 9,STRPTR(SEARCH),35]
15700		CAILE	TAC5,1
15800		JRST	NOTLAD		;TARGET-SIDE CAPTURER HAS TOO MANY LIBS
15900		JRST	NOGOOD		;CANT TELL
16000	EABLNK:	MOVE	SEARCH,@GB1TST(TAC3)
16100		PUSHJ	PDP,TACMRK
16200		TRNN	SEARCH,BNKOCC
16300		JRST	EABLN1
16400		MOVEI	TAC1,@GODOWN(TAC3)
16500		PUSHJ	PDP,TACMR1
16600		ADD	TAC,TAC4	;LINE 2 POINT BLANK, TOO SO GO ON
16700		JRST	EDGLAD
16800	EABLN1:	MOVE	TAC1,SEARCH
16900		ANDI	SEARCH,177
17000		LDB	TAC5,[POINT 9,STRPTR(SEARCH),35]
17100		TDNE	TAC1,FRIEND
17200		JRST	CAPTUR		;LADDER WORKED
17300		CAILE	TAC5,3
17400		JRST	NOTLAD		;STRING SAVED BY FRIENDLY
17500		CAILE	TAC5,2
17600		JRST	NOGOOD		;CANT TELL IF LADDER WORKED
17700		JRST	CAPTUR		;LADDER WORKED
17800	
17900	;*****TABLES USED TO ADJUST TAC3, TAC4 DURING GENERAL LADDER ANALYSIS
18000	T3TABL:	2
18100		3
18200		0
18300		1
18400	T4TABA:	3
18500		2
18600		1
18700		0
18800	T4TABB:	1
18900		0
19000		3
19100		2
19200	
19300	;**********
19400	;      THIS CODE CHECKS TO SEE IF A STRING CAN BE CAPTURED THROUGH A LADDER
19500	;ACROSS THE BOARD.  A SUCCESSFUL CAPTURE COMES FROM RUNNING THE ATTACKED
19600	;STRING INTO THE EDGE OR INTO SOME OTHER CHASING STONES.
19700	;**********
19800	TRYLAD:	SKIPN	REGSTR+7
19900		HRRE	TAC5,GODOWN+1(TAC1)	;REGS NOT SWAPPED
20000		SKIPE	REGSTR+7
20100		HRRE	TAC5,GODOWN+3(TAC1)	;REGS SWAPPED
20200		MOVEI	TAC4,@GODOWN(TAC1)	;LOCATION OF ENEMY STRING
20300		SUB	TAC4,TAC5	      ;ADDR OF WHERE OTHER FRIENDLY MUST BE
20400		MOVE	REPLCE,GB1(TAC4)
20500		TRNE	REPLCE,BNKOCC
20600		JRST	.+3		;PROPOSED MOVE POINT
20700		ANDI	REPLCE,177
20800		LDB	TAC3,[POINT 9,STRPTR(REPLCE),35]
20900		CAIL	TAC3,3
21000		JRST	TRYLA1
21100		SOJLE	TAC3,NOTLAD
21200		MOVE	TAC3,TAC4	;IS TWO-LIB MOVE AGAINST EDGE...
21300		SUB	TAC3,TAC5	;IF SO, THEN CAN CONTINUE WITH LADDER
21400		MOVE	TAC3,GB1(TAC3)
21500		TRNN	TAC3,NONOCC
21600		JRST	TRYSNP
21700	TRYLA1:	MOVEI	TAC3,3
21800		MOVEI	TAC1,@G1DIAG(TAC3)	;FIND CORRECT VALUE FOR TAC3
21900		CAIE	TAC1,GB1(TAC4)
22000		SOJGE	TAC3,.-2
22100		SUB	TAC4,REGSTR+4	      ;TAC4 DIAG OFFSET OF "OTHER" FRIENDLY
22200		MOVM	TAC4,TAC4		;USE DIAG OFFSET TO GET TAC4 TABLE
22300		CAIG	TAC4,BRDWTH-1
22400		SKIPA	TAC1,[T4TABB]
22500		MOVEI	TAC1,T4TABA
22600		HRRM	TAC1,T4SETT		;TAC4 TABLE SET UP NOW
22700		MOVEI	TAC4,3
22800		HRRE	TAC1,GODOWN(TAC4)	;FIND CORRECT VALUE FOR TAC4
22900		CAME	TAC5,TAC1
23000		SOJGE	TAC4,.-2
23100		MOVE	TAC1,@T4SETT		;GET OUT-OF-PHASE TAC4 VALUE
23200		MOVEI	TAC,@GODOWN+2(TAC1)	;THIS VALUE INITIALIZES BASE POINT
23300	;**********
23400	;	LOOK DOWN THE PATH OF A LADDER TO SEE IF IT WILL WORK.  NOTE
23500	;TAC,TAC3,TAC4,FRIEND MUST BE PRESET.
23600	;**********
23700	BRDLAD:	MOVE	SEARCH,GB1(TAC)		;LOOK AT CENTER OF TRIPLE
23800		TRNE	SEARCH,NONOCC
23900		JRST	CAPTUR			;LADDER WORKED
24000		TRNE	SEARCH,BNKOCC
24100		JRST	BBBLNK			;CENTER POINT BLANK
24200		MOVE	TAC1,SEARCH
24300		ANDI	SEARCH,177
24400		LDB	TAC5,[POINT 9,STRPTR(SEARCH),35]
24500		TDNE	TAC1,FRIEND
24600		JRST	BGOODG
24700		CAILE	TAC5,2
24800		JRST	NOTLAD		;STRING SAVED BY FRIENDLY
24900		CAIG	TAC5,1
25000		JRST	CAPTUR		;LADDER WORKED
25100		JRST	NOGOOD		;CANT TELL
25200	BGOODG:	CAILE	TAC5,1
25300		JRST	CAPTUR
25400		JRST	NOGOOD
25500	BBBLNK:	MOVE	SEARCH,@G1DIAG(TAC3)
25600		PUSHJ	PDP,TACMRK
25700		TRNE	SEARCH,NONOCC
25800		JRST	CAPTUR		;LADDER WORKED
25900		TRNE	SEARCH,BNKOCC
26000		JRST	BABLNK		;BOTH CENTER POINTS BLANK
26100		MOVE	TAC1,SEARCH
26200		ANDI	SEARCH,177
26300		LDB	TAC5,[POINT 9,STRPTR(SEARCH),35]
26400		TDNE	TAC1,FRIEND
26500		JRST	BGOODG
26600		CAILE	TAC5,3
26700		JRST	NOTLAD		;LADDER FAILED
26800		CAILE	TAC5,2
26900		JRST	NOGOOD		;CANT TELL
27000		JRST	CAPTUR		;LADDER WORKED
27100	BABLNK:	MOVE	SEARCH,@GB1TST(TAC4)
27200		MOVEI	TAC1,@G1DIAG(TAC3)
27300		SUBI	TAC1,GB1
27400		PUSHJ	PDP,TACMR1
27500		TRNN	SEARCH,BNKOCC
27600		JRST	T4SETT+2
27700	BABLN1:	MOVEI	TAC1,@GODOWN(TAC4)
27800		PUSHJ	PDP,TACMR1
27900		MOVEI	TAC,@GODOWN+2(TAC4)
28000		MOVEI	TAC,@G1DIAG(TAC3)
28100		SUBI	TAC,GB1		;TAC IS NOW READY FOR THE NEXT TRIPLE
28200		MOVE	TAC3,T3TABL(TAC3)
28300	T4SETT:	MOVE	TAC4,0(TAC4)	;SET BY GENERAL LADDER SETUP
28400		JRST	BRDLAD		;TRY NEXT TRIPLE
28500		MOVE	TAC1,SEARCH
28600		ANDI	SEARCH,177
28700		TDNE	TAC1,FRIEND
28800		JRST	BABLN1			;GO TO NEXT TRIPLE
28900		LDB	TAC5,[POINT 9,STRPTR(SEARCH),35]
29000		CAILE	TAC5,1
29100		JRST	NOTLAD
29200		JRST	BABLN1
29300	
29400	;**********
29500	;	WHEN A STRING IS IN FACT CAPTURABLE BY LADDER OR SNAPBACK, WE MUST
29600	;RECORD THIS FACT AND ADJUST THE DATA BASE ACCORDINGLY.  CAPTUR DOES QUITE
29700	;DIFFERENT THINGS DEPENDING ON THE KIND OF CAPTURE DISCOVERED.
29800	;**********
29900	CAPTUR:	MOVE	SEARCH,REGSTR+6
30000		LDB	TAC4,[POINT 9,STRPTR(SEARCH),26]
30100		ADD	TAC4,REGSTR+10	;POSSIBLE "EXTRA" CAPTURES
30200		JUMPN	ZER,CAPTU1
30300		MOVEI	TAC1,777777	;TAC1>0 MEANS LADDER INEVITABLE
30400	CAPLOS:	CAME	FRIEND,NFRND	;*****SEE IF LOSING LADDER IS A LOSS
30500		JRST	CAPTU2
30600		ADDM	TAC4,TCMPLX	;DEAD CHASER STONES IMPLY STRONGER TARGET
30700		SKIPE	FORSAV
30800	BADLA1:	TLOA	16,LADLSN	;BAD LADDER EXTENSION FOR NON-MOVER
30900		TLO	16,LADLSM	;BAD LADDER EXTENSION FOR MOVER
31000		JRST	NOTLA1
31100		ADDM	FRIEND,MSTSAV	;SAVER MUST AVOID LADDER
31200	BADLAD:	SKIPN	FORSAV
31300		JRST	BADLA1
31400		JRST	BADLA1+1
31500	CAPTU2:	CAME	SEARCH,AFFSTR+1
31600		JRST	BADLAD		;DONT EXTEND LOSING LADDER
31700		SKIPE	FORSAV
31800		JUMPLE	TAC1,BADLAD-1	;LADDER MAY NOT BE INEVITABLE
31900	CAPT22:	MOVEI	TAC5,2		;THIS IS AN INSTANT WIN FOR FORCER
32000		JRST	STOPIT
32100	CP2000:	TRO	16,LADLOS
32200		SKIPLE	REGSTR+12
32300		TLO	16,SNACPN	;CAPTURE BY NON-MOVER BY SNAPBACK
32400		MOVEI	TAC5,AFFMOV
32500	CP2001:	HRRZ	TAC2,0(TAC5)
32600		JUMPN	TAC2,CP2003
32700		SKIPE	FORSAV
32800		JRST	CP2002
32900		POP	PDP,TAC
33000		JRST	REPLAY		;THIS IS ANOTHER WKNTGT
33100	CP2003:	CAME	TAC2,REGSTR+4	;ADDRESS OF OTHER END
33200		AOJA	TAC5,CP2001
33300		HRLZI	TAC2,CAPFRD
33400		ORM	TAC2,0(TAC5)	;GIVE CAPFRD CREDIT TO "OTHER END"
33500		HRLZI	TAC2,HEURCF
33600		TLNN	BWREG,CONTGT+NXTTGT
33700		TRO	TAC2,SREVIV	;GIVE REVIVAL CREDIT TO "OTHER END"
33800		ORM	TAC2,AUXBTS-AFFMOV(TAC5)
33900	CP2002:	SKIPN	FORSAV
34000		JRST	CAPTU3
34100		CAME	SEARCH,AFFSTR+1
34200		JRST	CAPTU5		;NOT TARGET STRING
34300		SOS	MSTSAV		;TARGET CAN BE LADDERED
34400		TLNE	16,SURCAP
34500		ADDM	TAC5,MSTSAV	;TARGET CAN BE SNAPPED
34600		JRST	CAPTU5
34700	CAPTU1:	SKIPGE	REGSTR+12
34800		TLO	16,SURCAP	;CAPTURE BY "SURE" SNAPBACK
34900		JUMPG	ZER,CP2000
35000		SKIPLE	REGSTR+12
35100		TLO	16,SNACAP	;CAPTURE BY MOVER BY SNAPBACK
35200		SKIPE	FORSAV		;*****THIS IS WINNING LADDER
35300		JRST	CAPTU3
35400		SKIPN	STRGNM		;HOLDS TEMP1 FROM NEIGH1 IN LADANL
35500		TLO	BWREG,CONTGT	;FORCER AFFECTS TARGET COMPLEX BY SAVING
35600		CAMN	SEARCH,AFFSTR+1
35700		JRST	CAPT22			;FORCER WINS BY LADDER
35800	CAPTU5:	SETZ	TAC2,
35900		ADDM	TAC4,NOKVEC+5		;# SAVER STONES CAPTURED
36000		TLNN	BWREG,CONTGT+NXTTGT
36100		TRO	16,SREVIV
36200		TLO	BWREG,WKNTGT
36300		JRST	CAPTU3+3
36400	CAPTU3:	MOVEI	TAC2,3
36500		TLO	BWREG,CONTGT	;THIS MOVE AFFECTS TARGET COMPLEX
36600		ADDM	TAC4,NOKVEC+4		;# FORCER STONES CAPTURED
36700		MOVE	TAC4,FSLIBS(TAC2)
36800		LSH	TAC4,7
36900		OR	TAC4,SEARCH
37000		MOVEM	TAC4,FSLIBS(TAC2)
37100		MOVE	TAC4,FSLIBS+1(TAC2)
37200		PUSHJ	PDP,DELNAM
37300		MOVEM	TAC4,FSLIBS+1(TAC2)
37400		JRST	NOTLA1
37500	
37600	;**********
37700	;	LOOK AT POTENTIAL AND ACTUAL CAPTURES DISCOVERED BY THE "NOKPR"
37800	;LOOP TO SEE WHAT THE EXACT STATUS OF THESE CAPTURES IS.  THERE ARE
37900	;SEVERAL POSSIBLE ANSWERS:
38000	;1.  STRING IS DEAD EVEN IF HIS SIDE PLAYS FIRST
38100	;2.  STRING IS DEAD IF HIS OPPONENT PLAYS FIRST
38200	;3.  STRING IS NOT DEAD EVEN IF HIS OPPONENT PLAYS FIRST
38300	;4.  STRING MAY BE DEAD OR ALIVE, THIS LOOP CANT TELL
38400	;	SEE AUXBTS LIST FOR THE BITS SET BY THE LADDER MECHANISM.  THESE
38500	;BITS ARE EXTREMELY USEFUL FOR HEURISTIC ORDERING OF MOVE GOODNESS.
38600	;**********
38700	↑LADANL:MOVEI	TAC1,3
38800	LDANL1:	MOVE	ZER,BLKSAV(TAC1)	;USE LADCHK MARK SET UP ABOVE
38900		SOJL	ZER,NOTLA1+2
39000		HRLM	TAC1,T2SAVE
39100		MOVE	SEARCH,@GB1TST(TAC1)
39200		TDNE	SEARCH,NFRND
39300		XORI	FRIEND,BLKOCC+WHTOCC
39400		ANDI	SEARCH,177
39500		JUMPE	SEARCH,.+3
39600		CAIE	SEARCH,177
39700		CAMN	SEARCH,AFFSTR
39800		SAILERR <4>		;THIS SHOULD BE IMPOSSIBLE 
39900						;******** ERROR MESSAGE 4 ********
40000		MOVEM	SEARCH,REGSTR+6	;SAVE STRING NAME FOR USE IN LADCHK
40100		LDB	TAC3,[POINT 9,STRPTR(SEARCH),35]
40200		TRZN	ZER,10
40300		SOJ	TAC3,		;WANT (# LIBS)-1 UNLESS 1-LIB MOVER STRING
40400		PUSHJ	PDP,NEIGH1	;DOES CAP SAVE ANY FRIENDLIES
40500		SKIPE	NOLIBS
40600		JRST	NOTLA1		;MOVE DOES NOT CONCERN TARGET COMPLEX
40700		MOVE	SEARCH,REGSTR+6
40800		JUMPE	ZER,LADLP4
40900		CAIE	ZER,2000
41000		JRST	LADLP2
41100	;*****TWO-LIB STRING SAVING (AVOID BEING LADDERED)
41200		MOVEI	ZER,1
41300		JRST	LADLP4+1
41400	LADLP2:	JUMPE	TAC3,LADLP3
41500	;*****ONE-LIB STRING SAVING (AVOID BEING LADDERED)
41600		TDNN	FRIEND,NFRND
41700		SKIPA	TAC4,NOKVEC+5	;# CAPTURES BY FORCER
41800		SKIPA	TAC4,NOKVEC+4	;# CAPTURES BY SAVER
41900		SKIPA	TAC1,NOKVEC	;# ACTUAL SAVER LIBS
42000		MOVE	TAC1,NOKVEC+1	;# ACTUAL FORCER LIBS
42100		SOJLE	TAC1,CAPLOS	;MOVE HAS ONE LIB
42200		SKIPN	FORSAV
42300		JRST	.+4
42400		TLNN	BWREG,CONTGT+NXTTGT
42500		TRO	16,SREVIV
42600		TLOA	BWREG,WKNTGT
42700		TLO	BWREG,CONTGT
42800		SKIPLE	TEMP1
42900		JRST	LADL22		;LADDER WONT WORK
43000	LADL21:	SETZ	ZER,
43100		HRRZM	BWREG,REGSTR+4
43200		HLRZ	TAC1,T2SAVE
43300		MOVEM	TAC1,REGSTR+5
43400		JRST	LADCHK+1
43500	LADL22:	SKIPN	FORSAV
43600		SKIPA	TAC5,[1]
43700		MOVEI	TAC5,4
43800		MOVE	TAC4,FSLIBS(TAC5)
43900		LSH	TAC4,7
44000		OR	TAC4,TEMP3		;NAME OF AFFECTED STRING
44100		MOVEM	TAC4,FSLIBS(TAC5)
44200		JRST	NOTLA1
44300	;*****ONE-LIB STRING KILLING (SEE IF LADDER IS NECESSARY)
44400	LADLP3:	SKIPE	FORSAV
44500		JRST	.+5
44600		TLNN	BWREG,CONTGT+NXTTGT
44700		TRO	16,SREVIV
44800		TLO	BWREG,WKNTGT
44900		SKIPN	TEMP1
45000		TLO	BWREG,CONTGT
45100		SKIPE	TEMP1
45200		JRST	LADL21
45300		TLO	BWREG,CAPFRD		;THIS CAPTURE SAVES SOMETHING
45400		SKIPE	FORSAV
45500		JRST	LADL22+1
45600		MOVE	SEARCH,TEMP3
45700		LDB	SEARCH,[POINT 9,STRPTR(SEARCH),26]
45800		ADDM	SEARCH,NOKVEC+4		;# FORCER STONES SAVED
45900		JRST	LADL22+2
46000	;*****TWO-LIB STRING CHASING (CAN STRING BE CAPTURED)
46100	LADLP4:	SETO	ZER,
46200		SKIPLE	CLEAR,TEMP1
46300		JRST	NOTLA1			;LADDER CANT WORK
46400		MOVEM	CLEAR,STRGNM	;SAVE TEMP1 IN CASE LADADD CALLED
46500	
46600	;**********
46700	;	CHECK ATARI OF A STRING TO SEE IF IT IS AN OBVIOUS FORCED
46800	;CAPTURE.  THE POSSIBLE RESULTS ARE EITHER YES (DIRECTLY OR BY LADDER)
46900	;NO (BECAUSE THE FORCE OR LADDER DOESNT WORK) OR MAYBE (BECAUSE THE
47000	;PROGRAM IS TOO STUPID TO BE SURE OF THE RESULT).
47100	;**********
47200	LADCHK:	PUSHJ	PDP,FINDND		;GET OTHER END OF STRING
47300		MOVE	TAC,REGSTR+4		;GOT BY FINDND
47400		PUSHJ	PDP,TACMRK
47500		MOVEI	TAC3,3
47600		MOVEI	BLANK,BNKOCC
47700		TDNN	BLANK,@GB1TST(TAC3)
47800		JRST	.+3
47900		MOVEI	TAC1,@GODOWN(TAC3)
48000		PUSHJ	PDP,TACMR1
48100		SOJGE	TAC3,.-4
48200		SKIPN	TAC1,REGSTR+5		;GOT BY FINDND
48300		MOVEI	TAC1,4			;MAKE SURE @GB1TST WORKS
48400		MOVE	ENEMY,FRIEND	     ;FRIEND IS THE SIDE TRYING FOR CAPTURE
48500		XORI	ENEMY,BLKOCC+WHTOCC	;ENEMY IS THE SIDE TRYING TO SAVE
48600		MOVE	BLANK,@GB1TST+1(TAC1)	;NEXT-TO-ONLY-BLANK POINT
48700		MOVE	CLEAR,@GB1TST-1(TAC1)	;NEXT-TO-ONLY-BLANK POINT
48800		SETZM	REGSTR+10		;HOLDS "EXTRA" STONES CAPTURED
48900		SETZM	REGSTR+12		;TELLS METHOD OF CAPTURE
49000	;*****HANDLE CASE WHERE PROPOSED MOVE IS ONE OF THE NEIGHBORS
49100		SETZM	REGSTR+7		;FLAG FOR SWAPPING
49200		HRRZ	TAC3,NOKVEC+1		;# ACTUAL FORCER LIBS
49300		HRRZ	TAC4,NOKVEC		;# ACTUAL SAVER LIBS
49400		TDNE	FRIEND,NFRND
49500		EXCH	TAC3,TAC4	;TAC3 HAS CHASING SIDE LIBS
49600	;*****CHECK EXCEPTION CONDITIONS FOR QUICK DECISION
49700		JUMPLE	TAC3,NOTLAD	;CERTAINLY NOT LADDER
49800		JUMPN	ZER,SNAP0
49900		SOJLE	TAC4,CAPTUR	;STONES CANT ESCAPE
50000		CAIG	TAC4,1
50100		JRST	TRYFRC		;CANT TELL YET
50200		JRST	NOTLAD		;DEFINITELY NOT LADDER
50300	SNAP0:	CAILE	TAC3,1
50400		JRST	NOSNPB
50500		HRRZ	TAC5,BWREG
50600		SUB	TAC5,TAC
50700		MOVM	TAC5,TAC5
50800		CAIE	TAC5,BRDWTH
50900		CAIN	TAC5,1
51000		JRST	SNAP01
51100		CAIG	TAC4,4
51200		JRST	NOGOOD		;POSSIBLY A SNAPBACK
51300		JRST	NOTLAD
51400	SNAP01:	JUMPG	ZER,.+4
51500		SKIPE	FORSAV
51600		JRST	.+3
51700		JRST	.+3
51800		SKIPN	FORSAV
51900		SKIPA	TAC4,NOKVEC+1	;LHS HAS # LIBS ADDED BY CAPTURE
52000		MOVE	TAC4,NOKVEC	;LHS HAS # LIBS ADDED BY CAPTURE
52100		HLRZ	TAC4,TAC4
52200		SUBM	ENEMY,REGSTR+12	      ;IF CAPTURE THEN DEFENDING THE POINT
52300						;WILL NOT PREVENT IT
52400		JRST	TRYSNP+1	;TRY FOR SNAPBACK
52500	;*****SEE IF ONE OF THE BLANK POINTS IS THE CURRENT PROPOSED MOVE
52600	NOSNPB:	HRRZ	REPLCE,BWREG		;TAC OF PROPOSED MOVE
52700		CAIN	REPLCE,@GODOWN+1(TAC1)
52800		JRST	NOSNP1
52900		CAIE	REPLCE,@GODOWN-1(TAC1)
53000		JRST	TRYFRC
53100		EXCH	CLEAR,BLANK
53200		SETOM	REGSTR+7		;FLAG FOR SWAPPING
53300	NOSNP1:	MOVEI	BLANK,NONOCC
53400		TRNN	CLEAR,BNKOCC
53500		JRST	TRYSNP		;TRY FOR SNAPBACK
53600		MOVE	TAC4,TAC3
53700		JRST	TRYFR2		;THIS COULD BE A LADDER
53800	;*****SEE IF WE HAVE STARTED A LADDER
53900	TRYFRC:	TRNE	CLEAR,BNKOCC
54000		JRST	TRYFR1
54100		TRNN	BLANK,BNKOCC
54200		JRST	TRYSNP		;NEITHER POINT IS BLANK
54300		EXCH	CLEAR,BLANK
54400		SETOM	REGSTR+7		;FLAG FOR SWAPPING
54500	;*****DECISION WHEN REGISTER "CLEAR" IS BLANK
54600	TRYFR1:	TRNE	BLANK,NONOCC
54700		JRST	TRYEDG		;TRY FOR EDGE LADDER
54800		TDNN	BLANK,FRIEND
54900		JRST	TRYSNP
55000		MOVE	REPLCE,BLANK
55100		ANDI	REPLCE,177
55200		LDB	TAC4,[POINT 9,STRPTR(REPLCE),35]
55300	TRYFR2:	CAIL	TAC4,3
55400		JRST	TRYLAD		;TRY FOR LADDER
55500	;**********
55600	;	ACCUMULATE THE NUMBER OF LIBERTIES THE SAVING SIDE WILL ACQUIRE BY
55700	;PLAYING ON THE ONE MOVE OPEN TO HIM.  IF THIS NUMBER IS <2, THEN WE HAVE A
55800	;CAPTURE BY SNAPBACK.  IF THE NUMBER IS >2, THEN THERE IS NO FORCED CAPTURE
55900	;POSSIBLE.  IF THE NUMBER IS EXACTLY TWO, THEN THERE MAY OR MAY NOT BE
56000	;ANY CAPTURE POSSIBLE.  FURTHERMORE, THE CAPTURE BY SNAPBACK IS DIFFERENT
56100	;FROM THE CAPTURE BY LADDER...IT SETS REGSTR+12 FOR INTERPRETATION DURING
56200	;THE CAPTUR.  IT CAN ALSO SET STHRET.
56300	;**********
56400	TRYSNP:	SETZ	TAC4,
56500		SETZM	ENMCNT-1	;HOLDS # ATARIED FRIENDLY STONES
56600		TRNE	CLEAR,BNKOCC
56700		AOJA	TAC4,TRYSN1
56800		TRNE	CLEAR,NONOCC
56900		JRST	TRYSN1
57000		MOVE	REPLCE,CLEAR
57100		PUSHJ	PDP,ENMCNT
57200		ANDI	CLEAR,177
57300	TRYSN1:	TRNE	BLANK,BNKOCC
57400		AOJA	TAC4,TRYSN2
57500		TRNE	BLANK,NONOCC
57600		JRST	TRYSN2
57700		MOVE	REPLCE,BLANK
57800		PUSHJ	PDP,ENMCNT
57900		ANDI	BLANK,177
58000	TRYSN2:	MOVE	REPLCE,@GB1TST+2(TAC1)
58100		TRNE	REPLCE,BNKOCC
58200		AOJA	TAC4,SNPEND
58300		TRNN	REPLCE,NONOCC
58400		JRST	TRYSN3
58500		TDNN	ENEMY,@GB1TST+1(TAC1)
58600		TDNE	ENEMY,@GB1TST-1(TAC1)
58700		JRST	SNPEND			;ENEMY STONE ON EDGE
58800		MOVE	REPLCE,@G1IKKN+1(TAC1)
58900		TDNN	ENEMY,REPLCE
59000		JRST	.+4
59100		ANDI	REPLCE,177
59200		LDB	TAC3,[POINT 9,STRPTR(REPLCE),35]
59300		SOJG	TAC3,SNPEND
59400		MOVE	REPLCE,@G1IKKN-1(TAC1)
59500		TDNN	ENEMY,REPLCE
59600		SOJA	TAC4,SNPEND
59700		ANDI	REPLCE,177
59800		LDB	TAC3,[POINT 9,STRPTR(REPLCE),35]
59900		SOJG	TAC3,SNPEND
60000		SOJA	TAC4,SNPEND
60100	TRYSN3:	PUSHJ	PDP,ENMCNT
60200	;*****CHECK FOR DIAGONAL DUPLICATE LIBERTIES
60300		TDNN	ENEMY,@GB1TST+2(TAC1)
60400		JRST	SNPEND
60500		TDNN	ENEMY,@GB1TST+1(TAC1)
60600		JRST	DIACH1
60700		MOVE	TAC3,@G1DIAG+2(TAC1)
60800		TRNE	TAC3,BNKOCC
60900		SOJ	TAC4,		;DUPLICATE DIAG LIBERTY
61000	DIACH1:	TDNN	ENEMY,@GB1TST+3(TAC1)
61100		JRST	SNPEND
61200		MOVE	TAC3,@G1DIAG+3(TAC1)
61300		TRNE	TAC3,BNKOCC
61400		SOJ	TAC4,		;DUPLICATE DIAG LIBERTY
61500	;**********
61600	;    FROM THE NUMBER OF LIBERTIES (IN TAC4), DECIDE WHETHER THE STRING CAN
61700	;BE CAPTURED, IS NOT CAPTURABLE, OR MAY BE CAPTURABLE.
61800	;**********
61900	SNPEND:	JUMPGE	ZER,SNPEN1
62000		SKIPN	REGSTR+10
62100		JRST	SNPEN1
62200		SKIPE	FORSAV
62300		TRO	16,STHRET		;THREATENS TO CAPTURE TWO STRINGS
62400	SNPEN1:	SOJG	TAC4,SNPEN2
62500		AOS	REGSTR+12		;CAPTURE BY SNAPBACK
62600		CAIE	TAC4,0
62700		SUBM	ENEMY,REGSTR+12		;DEFENDING POINT WONT SAVE STONES
62800		JRST	CAPTUR
62900	SNPEN2:	SOJG	TAC4,NOTLAD
63000		SOSLE	ENMCNT-1
63100		JRST	NOTLAD		;TWO LIBS AND THREATENS ≥2 STONES
63200	;*****TURN ON THE MAYLAD BIT IF LADDER CHECK CANT DECIDE
63300	NOGOOD:	JUMPE	ZER,NOTLA1
63400		MOVE	SEARCH,REGSTR+6
63500		CAME	SEARCH,AFFSTR+1
63600		JRST	.+3
63700		TRO	16,FTHRET	;TARGET MAY BE LADDERED
63800		SETOM	NOTWIN		;DISABLE SOME WINNING CHECKS
63900		JUMPG	ZER,NOGOO1
64000		SKIPE	FORSAV
64100		TLO	BWREG,CONTGT	;LET SAVER TRY ALMOST-CAPTURE
64200		TROA	16,MAYLAD	;SNAP MAY WORK FOR MOVER
64300	NOGOO1:	TRO	16,MAYLAE	;SNAP MAY WORK FOR NONMOVER
64400		JRST	NOTLA1
64500	;*****TURN ON THE NLADDR BIT IF THERE IS NO LADDER
64600	NOTLAD:	JUMPE	ZER,NOTLA1
64700		CAIL	ZER,0
64800		TROA	16,NLADDE	;NOT LADDER FOR NON-MOVER
64900		TRO	16,NLADDR	;NOT LADDER FOR MOVER
65000	
65100	NOTLA1:	HRRZ	TAC,BWREG
65200		HLRZ	TAC1,T2SAVE
65300		MOVE	FRIEND,NFRND
65400		SOJGE	TAC1,LDANL1
65500		HRRZ	TAC2,T2SAVE
65600		POPJ	PDP,
65700	
65800	BEND
     

00100	;*****GET FRIENDLY STRNGS CONNECTED TO TARGET
00200	;*****GET WEAK CHASING STRINGS NEXT TO TARGET
00300	;*****NOTE SEARCH AND LIBSNO ARE ALREADY SET EXTERNALLY
00400	PLAYFS:	MOVE	TAC,STRPTR
00500		MOVEM	TAC,AFFSTR	;MAKE SURE WE DONT "FIND" THE UNUSED STRING
00600		MOVEM	SEARCH,AFFSTR+1	;STRING IS ITS OWN NEIGHBOR
00700		SETZM	AFFSTR+2	;HOLDS STRING NAMES OF NEIGHBORS
00800		LDB	TAC4,[POINT 9,STRPTR(SEARCH),17]
00900		MOVE	TAC1,GB1(TAC4)
01000		ANDI	TAC1,WHTOCC+BLKOCC
01100		MOVEM	TAC1,NFRND	;TELLS WHICH SIDE IS TARGET
01200	;*****SEE IF KOTAC MEANS ILLEGAL MOVE FOR CURRENT MOVER
01300		SETZ	TAC3,
01400		SKIPN	TAC,KOTAC
01500		JRST	KOFIX1		;NO KO POINT
01600		SUB	TAC4,TAC
01700		MOVM	TAC4,TAC4
01800		CAIE	TAC4,BRDWTH
01900		SOJN	TAC4,.+4
02000		HRRZ	TAC4,STRPTR(SEARCH)
02100		TRNN	TAC4,776776
02200		SETZM	SVCRIT		;1-LIB TARGET IS A KO
02300		MOVEI	TAC2,3
02400	KOFIX3:	TDNN	TAC1,@GB1TST(TAC2)
02500		JRST	KOFIX2
02600		SKIPE	FORSAV
02700		EXCH	TAC,TAC3	;SAVER CAN FILL AT KO POINT
02800		JRST	KOFIX1
02900	KOFIX2:	SOJGE	TAC2,KOFIX3
03000		SKIPN	FORSAV
03100		EXCH	TAC,TAC3	;FORCER CAN FILL AT KO POINT
03200	KOFIX1:	MOVEM	TAC,KOSAVE	;SET MOVER ILLEGAL KO RETAKE VALUE
03300		MOVEM	TAC3,KOSAV1	;SET NON-MOVER ILLEGAL KO RETAKE VALUE
03400		SETZM	AFFMOV		;HOLDS POSSIBLE MOVE LOCATIONS
03500		MOVEI	TAC1,MAXSTR	;CONSIDER UP TO MAXSTR STRINGS
03600		MOVEM	TAC1,BNDCNS	;SET MAX # STRINGS CUTOFF
03700		MOVEI	FRIEND,BCON+WCON	;SET FRIEND FOR GROUP POINTS
03800		PUSHJ	PDP,NEIGHS	;"SEARCH" IS SET EXTERNALLY
03900		SKIPG	BNDCNS
04000		JRST	SEXCSS		;TOO MANY STRINGS
04100	;*****IF MORE THAN ONE CONNECTION POINT, GET ALL FRIENDLIES
04200		MOVE	TAC1,NOCONS
04300		SOJG	TAC1,.+5
04400		MOVEI	TAC1,AFFSTR+2
04500		SKIPE	0(TAC1)
04600		AOJA	TAC1,.-1
04700		JRST	CONRC1-1
04800	;*****GET FRIENDLY STRINGS NEXT TO CONTGT STRINGS
04900		SETOM	LIBSNO		;ONLY COUNT CONNECTED FRIENDLIES
05000		MOVEI	TAC1,AFFSTR+2
05100		HRRM	TAC1,CONREC
05200	CONREC:	HRRZ	SEARCH,0	;NO REG AVAILABLE
05300		JUMPE	SEARCH,CONRC1
05400		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
05500		MOVE	TAC1,GB1(TAC)
05600		TDNE	TAC1,NFRND
05700		PUSHJ	PDP,NEIGHS
05800		SKIPG	BNDCNS
05900		JRST	SEXCSS		;TOO MANY STRINGS
06000		AOS	CONREC
06100		JRST	CONREC
06200	;*****LOOK AT THE WEAK CHASING STRINGS AND MAKE SURE THEY ARE NOT CONNECTED
06300	;*****TO STRONG STRNGS.  IF THEY ARE, THERE IS NOT POINT IN LOOKING
06400	;*****AT THEM UNLESS THEY CAN BE CAPTURED OR ATARIED.
06500		HRRM	TAC1,CONREC		;SET CONREC FOR FUTURE USE
06600	CONRC1:	MOVE	TAC3,NFRND
06700		SETZ	TAC1,
06800		MOVEI	TAC2,1
06900	WK1LOP:	HRRZ	SEARCH,AFFSTR(TAC2)
07000		JUMPE	SEARCH,WK1LP1
07100		MOVEM	SEARCH,BLKSAV(TAC2)	;SAVE AFFECTED STRINGS LIST
07200		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
07300		TDNE	TAC3,GB1(TAC)
07400		AOJA	TAC2,WK1LOP		;TARGET-SIDE STRING
07500		CAIL	TAC1,=9
07600		JRST	SEXCSS
07700		MOVEM	SEARCH,WEAKNT(TAC1)
07800		AOJA	TAC1,.-4
07900	WK1LP1:	SETZM	BLKSAV(TAC2)	;END MARKER
08000		SETOM	STRONG		;HOLDS END INDEX OF "STRONG" WKNTGTS
08100		SETZM	WEAKNT(TAC1)	;END MARKER
08200		JUMPE	TAC1,NOWEAK
08300		MOVE	TAC1,BNDCNS
08400		MOVEM	TAC1,TEMP1
08500		MOVEI	TAC1,1
08600		MOVEM	TAC1,LIBSNO	;SET TO PICK UP ATARIED TARGET-SIDES
08700		SETZ	TAC1,
08800	WKLOOP:	SKIPN	SEARCH,WEAKNT(TAC1)
08900		JRST	WKLOPF
09000		MOVEM	SEARCH,AFFSTR+2
09100		SETZM	AFFSTR+3
09200		MOVEI	TAC2,MAXSTR
09300		MOVEM	TAC2,BNDCNS
09400		PUSH	PDP,TAC1
09500		PUSHJ	PDP,NEIGHS
09600		POP	PDP,TAC1
09700	;*****SEE IF WKNTGT IS REALLY WEAK
09800		HRRZ	SEARCH,AFFSTR+2
09900		LDB	TAC3,[POINT 9,STRPTR(SEARCH),35]
10000		SUBI	TAC3,2		;ALLOW FOR OVERLAPPING LIBS
10100		MOVE	TAC4,NFRND
10200		MOVEI	TAC2,AFFSTR+3
10300	WKLOP1:	HRRZ	SEARCH,0(TAC2)
10400		JUMPE	SEARCH,WKLOP2
10500		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
10600		TDNE	TAC4,GB1(TAC)
10700		AOJA	TAC3,WKLOP2-1	;ATARIED NEIGH COUNTS AS A LIB
10800		LDB	TAC5,[POINT 9,STRPTR(SEARCH),35]
10900		SUBI	TAC5,2		;ALLOW FOR OVERLAPPING LIBS
11000		ADD	TAC3,TAC5
11100		AOJA	TAC2,WKLOP1
11200	WKLOP2:	CAMG	TAC3,TGLIBS
11300		AOJA	TAC1,WKLOOP
11400		HRRZ	SEARCH,AFFSTR+2
11500		AOS	TAC2,STRONG	;INCREMENT # STRONG CHASERS
11600		MOVEM	SEARCH,WEAKNT(TAC2)
11700		AOS	TEMP1		;NOTE ONE FEWER STRING TO LOOK AT
11800		AOJA	TAC1,WKLOOP
11900	WKLOPF:	MOVE	TAC1,TEMP1
12000		MOVEM	TAC1,BNDCNS
12100		MOVE	TAC1,[XWD -MAXSTR,1]
12200		SKIPN	TAC2,BLKSAV(TAC1)
12300		JRST	NOWEAK-1
12400		MOVEM	TAC2,AFFSTR(TAC1)
12500		AOBJN	TAC1,.-3
12600		SETZM	AFFSTR(TAC1)
12700	;*****SET CUTOFFS AND TESTS IN TERMS OF HOW MANY MOVES WILL BE CONSIDERED
12800	;*****BEFORE THE PROGRAM GIVES UP CHASING A STRING
12900	NOWEAK:	MOVE	TAC1,BNDCNS
13000		SUBI	TAC1,MAXSTR-MXSTRG
13100		SKIPG	TAC1
13200		JRST	SEXCSS		;TOO MANY STRINGS
13300		MOVEM	TAC1,BNDCNS
13400		MOVE	FRIEND,NDXFOR
13500		CAIL	FRIEND,PH1CUT	;CUTOFF AT 19 LEVELS
13600		SKIPA	FRIEND,[MXMVES-PHASE2]	;ALLOW 4 MOVES AFTER CUT
13700		MOVEI	FRIEND,MXMVES-PHASE1	;ALLOW 6 MOVES BEFORE CUT
13800		MOVEM	FRIEND,LOWBND
13900		MOVEI	FRIEND,MXMVES
14000		MOVEM	FRIEND,BNDCNL	;SET MAX # MOVES CUTOFF
14100	;*****GET LIBERTIES OF THE OBVIOUS STRINGS
14200		MOVEI	FRIEND,AFFSTR+1	;IGNORE REPLCE AT AFFSTR+0
14300		HRRM	FRIEND,PLAYF1
14400	PLAYF1:	HRRZ	SEARCH,0	;NO REGISTER AVAILABLE FOR THIS LOOP
14500		JUMPE	SEARCH,PLAYF0
14600		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
14700		MOVE	TAC1,GB1(TAC)
14800		TDNE	TAC1,NFRND
14900		JRST	ISFRND
15000		LDB	TAC2,[POINT 9,STRPTR(SEARCH),35]
15100		CAIG	TAC2,2
15200		JRST	ISCHAS		;ALWAYS CONSIDER 1-LIB & 2-LIB
15300		SKIPGE	TAC2,STRONG
15400		JRST	ISCHAS
15500		CAMN	SEARCH,WEAKNT(TAC2)
15600		JRST	PLAYF3+3		;THIS IS "STRONG" WKNTGT
15700		SOJGE	TAC2,.-2
15800	ISCHAS:	HRLZI	FRIEND,WKNTGT
15900		JRST	PLAYF3
16000	ISFRND:	HRLZI	FRIEND,CONTGT
16100		CAMN	SEARCH,AFFSTR+1
16200		TLC	FRIEND,NXTTGT+CONTGT
16300	PLAYF3:	PUSHJ	PDP,LBSGET+1	;GET POINTS NEXT TO NEIGHBORS
16400		SKIPG	BNDCNL
16500		JRST	LEXCSS		;TOO MANY LIBERTIES
16600		AOS	PLAYF1
16700		JRST	PLAYF1
16800	PLAYF0:	MOVEI	TAC1,AFFMOV
16900		SKIPE	0(TAC1)
17000		AOJA	TAC1,.-1
17100		MOVEM	TAC1,AUGSRT	;THIS IS FIRST AVAILABLE AUGMENT SLOT
17200	;*****GET WEAK FRIENDLIES BEYOND WEAK CHASERS AND
17300	;*****GET WEAK CHASERS NEXT TO NON-TARGET FRIENDLIES
17400	PLAYFF:	MOVEI	TAC,AFFSTR+2
17500		HRRM	TAC,ENMYCP
17600	ENMYCP:	HRRZ	SEARCH,0	;NO REGISTER AVAILABLE
17700		JUMPE	SEARCH,ENMYC2+2
17800		SETZ	FRIEND,		;ONLY WANT ONE STRING AT A TIME
17900		MOVE	TAC3,CONREC
18000		CAMG	TAC3,ENMYCP	;COMPARING INSTRUCTIONS IS UGLY
18100		JRST	ENMYC3-1	;DONT WANT FAKE WKNTGT'S
18200		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
18300		LDB	TAC2,[POINT 9,STRPTR(SEARCH),35]
18400		MOVE	TAC1,GB1(TAC)
18500		TDNN	TAC1,NFRND
18600		JRST	ENMYC4
18700		SKIPE	FORSAV
18800		JRST	ENMYC3
18900		JRST	ENMYC3-2
19000	ENMYC4:	CAMLE	TAC2,TGLIBS
19100		JRST	ENMYC2		;CANT THREATEN THIS STRING
19200		SKIPGE	TAC3,STRONG
19300		JRST	.+4
19400		CAMN	SEARCH,WEAKNT(TAC3)
19500		JRST	ENMYC2		;THIS IS "STRONG" WKNTGT
19600		SOJGE	TAC3,.-2
19700		MOVEI	FRIEND,BCON+WCON	;WKNTGT NEIGHBORS ARE ALLOWED
19800		SKIPN	FORSAV
19900		JRST	ENMYC3
20000		SOJG	TAC2,ENMYC3
20100		MOVEI	TAC2,1		;DONT LET LIBSNO BE 0
20200	ENMYC3:	MOVEM	TAC2,LIBSNO
20300		PUSHJ	PDP,NEIGHS
20400		SKIPG	BNDCNS
20500		JRST	SEXCSS		;TOO MANY STRINGS
20600	ENMYC2:	AOS	ENMYCP
20700		JRST	ENMYCP
20800	;*****GET LIBERTIES OF THE NOT-SO-OBVIOUS STRINGS
20900		SETZM	AUGFLG		;ALLOW ALL AUGMENT MOVES
21000		MOVE	SEARCH,BNDCNL
21100		MOVEM	SEARCH,TEMP3	;SAVE OLD BNDCNL IF AUGMENT FAILS
21200		HRRZ	FRIEND,PLAYF1
21300		HRRM	FRIEND,AUGFS1
21400	AUGFS1:	SKIPN	SEARCH,0	;NO REGISTER AVAILABLE
21500		JRST	PLAYF2
21600		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
21700		MOVE	TAC1,GB1(TAC)
21800		TDNE	TAC1,NFRND
21900		JRST	AUGFS3
22000		LDB	TAC2,[POINT 9,STRPTR(SEARCH),35]
22100		SKIPE	FORSAV
22200		SOJ	TAC2,
22300		CAMLE	TAC2,TGLIBS
22400		JRST	AUGFS4		;ENEMY STRING IS TOO BIG
22500		JRST	.+2
22600	AUGFS3:	SKIPN	AUGFLG		;≠0 MEANS ALLOW ONLY WKNTGT MOVES
22700		PUSHJ	PDP,LBSGET
22800		SKIPG	BNDCNL
22900		JRST	AUGFS2		;TOO MANY LIBERTIES
23000	AUGFS4:	AOS	AUGFS1
23100		JRST	AUGFS1
23200	AUGFS2:	MOVE	TAC1,TEMP3
23300		MOVEM	TAC1,BNDCNL	;RESTORE OLD BNDCNL
23400		MOVE	TAC1,AUGSRT
23500		SETZM	0(TAC1)		;RESTORE OLD AFFMOV LIST
23600		SKIPL	AUGFLG
23700		JRST	.+4
23800		SKIPE	FORSAV
23900		JRST	LEXCSS		;SAVER WINS BY "TOO MANY MOVES"
24000		JRST	PLAYF2		;FORCER CONTINUES WITHOUT AUGMENTS
24100		SETOM	AUGFLG
24200		JRST	AUGFS1-2	;TRY AGAIN WITHOUT AUGMENTING FRIENDLIES
     

00100	;**********
00200	;      THIS IS START OF AN EXTRACTION OF PROPERTIES FOR EACH PROPOSED MOVE.
00300	;THE PROPERTIES ARE REPRESENTED AS BITS IN THE LEFT HALF OF REGISTER BWREG
00400	;AND IN WTARM (PROPOSED MOVES LIST).  BESIDES ASSIGNING PROPERTIES, THE
00500	;LOOP IS CAPABLE OF DELETING USELESS OR ILLEGAL MOVES FROM FURTHER
00600	;CONSIDERATION.
00700	;**********
00800	PLAYF2:	SETO	TAC2,
00900		SETZM	TCMPLX
01000		SKIPN	TAC1,AFFMOV+1(TAC2)
01100		JRST	.+4
01200		TLNE	TAC1,NXTTGT+CONTGT
01300		AOS	TCMPLX		;COUNT # BLANKS IN TARGET COMPLEX
01400		AOJA	TAC2,.-4
01500		MOVEI	TAC2,MAXSTR
01600		SETZM	LBSSTR(TAC2)	;ZERO OUT LIBERTY SCORES
01700		SETZM	AUXBTS(TAC2)	;ZERO OUT AUXILIARY BITS
01800		SOJGE	TAC2,.-2
01900		MOVEI	TAC2,AFFMOV
02000		SETZM	XTDFRC		;FORCER FORCED MOVE ADDRESS
02100		SETZM	MUSTSV		;≠0 MEANS MUST SAVE STONES
02200		SETZM	MSTSAV		;≠0 MEANS A LADDER MUST BE AVOIDED
02300		MOVE	TAC1,NDXFOR
02400		SETZM	NOTWIN
02500		CAIG	TAC1,5
02600		SETOM	NOTWIN		;DONT ALLOW CERTAIN WINNERS AT START
02700		SETZM	XTDFR1		;SECOND FORCED MOVE ADDRESS
02800		SETZM	SAVWIN		;COUNTS NUMBER OF SAVER WINNERS FOUND BY FORCER
02900		SETZM	SAVWN1		;FORCED SAVE OF FRIENDLY
03000		SETZM	CONFLG		;NONZERO IF THERE IS A CONTGT WINNER
03100		SETOM	EYECNT		;COUNTER FOR # EYES
03200	PRPLOP:	MOVE	16,AUXBTS-AFFMOV(TAC2)
03300		SKIPN	BWREG,0(TAC2)
03400		JRST	BUBLP2
03500		JUMPL	BWREG,ILLPR1	;THIS POINT HAS ALREADY BEEN DONE
03600		HRRZ	TAC,BWREG
03700	;*****ILLEGAL AND UNACCEPTABLE MOVE CHECKING
03800		CAME	TAC,KOSAVE	;THIS MOVE IS ILLEGAL KO RETAKE FOR MOVER
03900		JRST	ILLPR1+1
04000		TLO	16,SILLPT
04100		TLZ	BWREG,777777-(NXTTGT+CONTGT+WKNTGT)	;"REALLY" BAD MOVE
04200	ILLPRP:	TLON	BWREG,400000	;MAKE BWREG NEGATIVE
04300		AOS	BNDCNL		;THIS FREES ANOTHER MOVE SLOT
04400		MOVEM	BWREG,0(TAC2)	;MARK MOVE UNACCEPTABLE
04500		MOVEM	16,AUXBTS-AFFMOV(TAC2)
04600	ILLPR1:	AOJA	TAC2,PRPLOP
04700		MOVEM	TAC2,T2SAVE
04800	;*****GET LIBERTY ESTIMATE FOR CURRENT PROPOSED MOVE
04900		MOVE	FRIEND,NFRND
05000		PUSHJ	PDP,LIBEST
05100		MOVEI	TAC1,10
05200		MOVE	TAC2,LIBVEC(TAC1)
05300		MOVEM	TAC2,NOKVEC(TAC1)	;SAVE LIBEST INFO
05400		SOJGE	TAC1,.-2
05500		OR	16,LIBVEC+11		;SET CURRENT MOVE KO STATUS
05600	;**********
05700	;	SET UP A RECORD OF STRINGS 2-LIBBED, ATARIED, OR CAPTURED BY EACH
05800	;SIDE.  SET UP INPUT TO LADANL SO LADDER POSSIBILITIES CAN BE CHECKED
05900	;WHERE NECESSARY FOR EACH SIDE.
06000	;**********
06100		MOVEI	TAC1,5
06200		SETZM	FSLIBS(TAC1)
06300		SETZM	BLKSAV(TAC1)
06400		SOJGE	TAC1,.-2
06500		SETZM	NOKVEC+11		;# "NEW" SAVER LIBS
06600		SETZM	NWSTRG			;ARRAY HOLDS NEW SAVER STRINGS
06700		SETZ	TAC2,
06800		MOVEI	TAC5,3
06900	NOKPR2:	MOVE	SEARCH,NGHSTR(TAC2)
07000		MOVEM	SEARCH,GRUPNO(TAC2)	;SAVE NEIGHBOR STRING NAME
07100		JUMPE	SEARCH,NOKPR1
07200	NOKP21:	LDB	TAC3,[POINT 7,@GB1TST(TAC5),35]
07300		JUMPE	TAC3,.+3
07400		CAMN	TAC3,SEARCH
07500		JRST	NOKP22
07600		SOJGE	TAC5,NOKP21
07700		SAILERR <5>		;******** ERROR MESSAGE 5 ********
07800	NOKP22:	LDB	TAC3,[POINT 9,STRPTR(SEARCH),35]	;# LIBS
07900		LDB	TAC1,[POINT 9,STRPTR(SEARCH),17]
08000		TDNN	FRIEND,GB1(TAC1)
08100		JRST	NOKPR4
08200		CAILE	TAC3,3
08300		JRST	.+5
08400		MOVE	TAC4,FSLIBS-1(TAC3)
08500		LSH	TAC4,7
08600		OR	TAC4,SEARCH
08700		MOVEM	TAC4,FSLIBS-1(TAC3)
08800		SOJN	TAC3,NOKPR3
08900		MOVEI	TAC3,1001	;ONE-LIB TARGET-SIDE STRING
09000		SKIPE	FORSAV
09100		JRST	NOKPR9
09200		CAME	SEARCH,AFFSTR+1
09300		JRST	NOKP66+1
09400		MOVEI	TAC5,4
09500		JRST	STOPIT		;JUST CAPTURED TARGET STRING
09600	;*****SEE IF THIS IS A NON-TARGET-COMPLEX STRING
09700	NOKPR3:	PUSHJ	PDP,NEWSTR
09800		JUMPE	TAC4,.+2
09900		ADDM	TAC3,NOKVEC+11		;NEW LIBS FROM NEW STRING
10000		CAIN	TAC3,2
10100		TLOA	16,STWOLB	;SAVER STONES TWOLIBBED
10200		CAIE	TAC3,1
10300		AOJA	TAC2,NOKPR2
10400		SKIPN	FORSAV
10500		JRST	NOKP66
10600	;*****SEE IF THREAT WILL BE A CAPTURE INSTEAD
10700	NOKP99:	MOVEI	TAC3,2001	;MARK FOR 2-LIB AVOIDING LADDER
10800		JRST	NOKP66+1
10900	NOKPR4:	CAILE	TAC3,3
11000		JRST	.+5
11100		MOVE	TAC4,FSLIBS+2(TAC3)
11200		LSH	TAC4,7
11300		OR	TAC4,SEARCH
11400		MOVEM	TAC4,FSLIBS+2(TAC3)
11500		SOJN	TAC3,NOKPR5
11600		MOVEI	TAC3,1001	;ONE LIB CHASER-SIDE STRING
11700		SKIPN	FORSAV
11800	NOKPR9:	TRO	TAC3,10		;MARK ONE-LIB STRING "ON MOVER SIDE"
11900		JRST	NOKP66+1
12000	NOKPR5:	CAIN	TAC3,2
12100		TLOA	16,FTWOLB	;MOVE HERE TWOLIBS FORCER STRING
12200		CAIE	TAC3,1
12300	NOKPR6:	AOJA	TAC2,NOKPR2
12400		SKIPN	FORSAV
12500		JRST	NOKP99		;FORCER MOVING, FORCER 1-LIB STRING
12600	NOKP66:	MOVEI	TAC3,1		;MARK FOR CREATING 2-LIB LADDER
12700		MOVEM	TAC3,BLKSAV(TAC5)
12800		SOJA	TAC5,NOKPR6
12900	;**********
13000	;	LOOK AT BLANKS NEXT TO PROPOSED MOVE TO SEE IF SAVER MOVE WILL
13100	;MAKE THEM FORCER SELF-ATARI OR IF THERE IS POSSIBLE HELP FOR SAVER
13200	;FROM NON-TARGET-COMPLEX SAVER STRINGS BEYOND THE BLANK.  ALSO SEE IF
13300	;THIS BLANK IS "NEW" TO THE TARGET COMPLEX.
13400	;**********
13500	NOKPR1:	SETOM	TWOATR		;COUNTS SAVER-CREATED FORCER SELF-ATES
13600		SETZM	MORLBS		;LIBS FROM CONNECT TO NEW STRING
13700		SETZM	MORLBF		;LIBS FROM FORCER CONNECTION
13800		HRRZ	TAC1,NOKVEC
13900		CAIGE	TAC1,2
14000		JRST	BNKPR1+1	;CURRENT MOVE HAS <2 SAVER LIBS
14100		MOVEI	CLEAR,177	;USED TO TEST FOR BLANKS
14200		MOVEI	TAC1,3
14300	BNKPR2:	TDNE	CLEAR,@GB1TST(TAC1)
14400		JRST	BNKPR1		;NOT A BLANK
14500		MOVEM	TAC1,REGSTR+1
14600		MOVEI	TAC,@GODOWN(TAC1)
14700		PUSHJ	PDP,LIBEST
14800		HRRZ	TAC2,LIBVEC+1
14900		CAILE	TAC2,3
15000		JRST	BNKPR5		;FORCER WILL HAVE >2 LIBS
15100		SUBI	TAC2,2
15200		JUMPLE	TAC2,.+4
15300		SKIPE	LIBVEC+3
15400		JRST	BNKPR5		;FORCER STRING SUPPORTS CUT
15500		JRST	BNKPR3-1
15600		AOSLE	TWOATR		;FORCER SELF-ATE POINT CREATED
15700		TLO	BWREG,TWOATE	;≥2 FORCER SELF-ATE POINTS
15800		MOVEI	TAC1,NGHSTR
15900	BNKPR3:	SKIPN	SEARCH,0(TAC1)
16000		JRST	BNKPR5
16100		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
16200		TDNN	FRIEND,GB1(TAC)
16300		AOJA	TAC1,BNKPR3		;FORCER NEIGHBOR STRING
16400		LDB	TAC3,[POINT 9,STRPTR(SEARCH),35]
16500		CAIGE	TAC3,2
16600		AOJA	TAC1,BNKPR3		;ATARIED SAVER NEIGHBOR
16700		MOVEI	TAC4,GRUPNO
16800		SKIPN	TAC5,0(TAC4)
16900		JRST	BNKPR4
17000		CAME	TAC5,SEARCH
17100		AOJA	TAC4,.-3
17200		AOJA	TAC1,BNKPR3	;NEIGHBOR OF PROPOSED MOVE ALSO
17300	BNKPR4:	PUSHJ	PDP,NEWSTR
17400		JUMPE	TAC4,.+4	;NOT NEW STRING TO TARGET
17500		JUMPLE	TAC2,.+3
17600		SUBI	TAC3,2
17700		ADDM	TAC3,MORLBS	;ADDED LIBS FROM SAVER CONNECTION
17800		AOJA	TAC1,BNKPR3
17900	;*****SEE IF BLANK NEW TO TARGET COMPLEX
18000	BNKPR5:	MOVE	TAC1,REGSTR+1
18100		HRRZ	TAC,BWREG
18200		MOVEI	TAC5,@GODOWN(TAC1)
18300		SETZ	TAC3,
18400		SKIPN	SEARCH,AFFMOV(TAC3)
18500		JRST	BNKP11		;CANT FIND LIBERTY ON MOVES LIST
18600		CAIE	TAC5,0(SEARCH)
18700		AOJA	TAC3,.-3
18800		TLNE	SEARCH,NXTTGT
18900		JRST	BNKPR1
19000		TLNN	SEARCH,CONTGT
19100		JRST	BNKP11		;THIS  LIB IS NEW TO TARGET COMPLEX
19200		MOVE	TAC3,AUXBTS(TAC3)
19300		TLNN	TAC3,NEWCGT
19400		JRST	BNKPR1
19500	BNKP11:	AOS	NOKVEC+11	;NEW LIBERTY FOR TARGET COMPLEX
19600		MOVEI	TAC,@GODOWN(TAC1)
19700		PUSHJ	PDP,TACMRK
19800		MOVEI	TAC,@GODOWN+2(TAC1)
19900	BNKPR1:	SOJGE	TAC1,BNKPR2
20000		HRRZ	TAC2,T2SAVE
20100	;*****LADDER ANALYSIS TO CHECK FORCED CAPTURES
20200		PUSHJ	PDP,LADANL
20300		TLNE	BWREG,NXTTGT
20400		JRST	TGCHEK
20500		SKIPN	FORSAV
20600		JRST	TGCHK1
20700		SKIPN	MSTSAV
20800		SKIPE	SVCRIT
20900		JRST	TGCHEK
21000	TGCHK1:	MOVE	TAC1,TCMPLX	;TARGET COMPLEX STRENGTH
21100		SUB	TAC1,FORSAV	;ADJUST ONE LIB FOR MOVER
21200		CAMG	TAC1,CUTLBX
21300		JRST	TGCHEK
21400		MOVNI	TAC5,=15	;TARGET COMPLEX IS TOO STRONG
21500		JRST	SEXCSS+1
21600	;**********
21700	;	SET BITS IN LEFT HALF OF BWREG TO DENOTE CAPTURES OR SAVES
21800	;OR THREATS FOR EITHER SIDE.  THESE FORCING QUANTITIES ARE USEFUL IN
21900	;DECIDING BETWEEN MOVES FOR FORWARD PRUNING.
22000	;**********
22100	TGCHEK:	MOVEI	TAC1,FSLIBS
22200		MOVEI	TAC3,FSLIBS+3
22300		SKIPE	FORSAV
22400		EXCH	TAC1,TAC3	;TAC1 POINTS TO SIDE NOT MOVING
22500		SKIPN	TAC4,0(TAC1)
22600		JRST	NDCAPS		;NO CAPTURES FOR MOVER
22700		TLO	BWREG,CAPENM
22800		SKIPE	FORSAV
22900		AOSG	TWOATR
23000		TRNE	TAC4,37600
23100		TLO	BWREG,TWOATE
23200	NDCAPS:	SKIPN	TAC4,0(TAC3)
23300		JRST	NDCAP1		;NO CAPTURES FOR NON-MOVER
23400		TLO	BWREG,CAPFRD
23500		SKIPN	FORSAV
23600		AOSG	TWOATR
23700		TRNE	TAC4,37600
23800		TLO	BWREG,TWOATE
23900	NDCAP1:	SKIPE	1(TAC1)
24000		TLO	BWREG,THRTGS
24100		SKIPE	1(TAC3)
24200		TLO	BWREG,SAVTGS
24300		SKIPN	FSLIBS+2
24400		SKIPE	FSLIBS+5
24500		TLO	BWREG,TWOLIB
24600	;*****SAVER 1-LIB TARGET REQUIRES INSTANT SAVING MOVES
24700		SKIPN	SVCRIT
24800		JRST	SVCRI1
24900		TLNN	BWREG,NXTTGT
25000		JRST	SVCRI1-3
25100		MOVE	TAC1,NOKVEC+3	;# FORCER LIBS FROM STRINGS
25200		ADD	TAC1,NOKVEC+10	;# BLANKS
25300		SUB	TAC1,NOKVEC+7	;# FORCER DUPLICATE LIBS
25400		SOJLE	TAC1,.+2
25500		TRO	16,SEMPT	;IF ANOTHER MOVE SAVES, THIS WILL BE FSATE
25600		JRST	SVCRI1
25700		TLNE	BWREG,CONTGT
25800		TLNN	BWREG,CAPFRD
25900		JRST	ILLPRP-1	;MOVE DIDNT ACT TO SAVE TARGET
26000	;**********
26100	;	NOW USE THE PROPERTIES JUST CALCULATED TO DETERMINE ILLEGAL AND
26200	;UNACCEPTABLE MOVES.  CHECK FOR SEVERAL SORTS OF EXCEPTIONAL CONDITIONS.
26300	;TRY TO EXPAND THE NUMBER OF MOVES UNDER CONSIDERATION (OR EVEN THE NUMBER
26400	;OF STRINGS CONSIDERED AFFECTED).
26500	;**********
26600	SVCRI1:	MOVE	SEARCH,NOKVEC+10	;# BLANKS
26700		ADD	SEARCH,NOKVEC+3		;# FORCER STRING LIBS ADDED
26800		SUB	SEARCH,NOKVEC+7		;# FORCER LIB DUPLICATIONS
26900		ADD	SEARCH,NOKVEC+5		;# SAVER STONES CAPTURED
27000		HRRM	SEARCH,LBSSTR-AFFMOV(TAC2)	;TOT # FORCER "LIBS"
27100		MOVE	TAC3,NOKVEC+4		;# FORCER STONES CAPTURED
27200		ADD	TAC3,NOKVEC+10
27300		ADD	TAC3,NOKVEC+2		;# SAVER STRING LIBS ADDED
27400		SUB	TAC3,NOKVEC+6		;# SAVER LIB DUPLICATIONS
27500		HRLM	TAC3,LBSSTR-AFFMOV(TAC2)	;TOT # SAVER "LIBS"
27600		TLNN	BWREG,NXTTGT
27700		JRST	.+5
27800		MOVE	TAC1,TAC3	;POSSIBLE CORRECTION FOR NOKVEC+11
27900		SUB	TAC1,TGLIBS
28000		CAMGE	TAC1,NOKVEC+11
28100		MOVEM	TAC1,NOKVEC+11	;REMOVE "EXTRA" NEW LIBERTIES
28200	;**********
28300	;	ESTIMATE THE NUMBER OF LIBERTES "BEYOND" A CAPTURED STRING.  THIS
28400	;MEANS NEW LIBERTIES FROM CONNECTING TO FRIENDLIES NOT ALREADY IN THE
28500	;TARGET COMPLEX ("THROUGH" THE KILLED STRING).  IF THE CAPTURE IS ONLY
28600	;THREATENED, THEN SET STHRET WHEN (# CAPTURES)+(# NEW LIBS)+(MORLBS) IS
28700	;ENOUGH TO BE A WINNER FOR SAVER.
28800	;**********
28900	;*****ADD LIBS BEYOND MOVER'S CAPTURED STONES
29000		SKIPN	FORSAV
29100		SKIPA	SEARCH,FSLIBS
29200		MOVE	SEARCH,FSLIBS+3
29300	ADDCPM:	JUMPE	SEARCH,ADDCPN-3
29400		MOVEM	SEARCH,STRGNM
29500		ANDI	SEARCH,177
29600		PUSHJ	PDP,NOCAPW
29700		MOVE	TAC1,NOLIBS
29800		SKIPE	FORSAV
29900		JRST	.+3
30000		ADDM	TAC1,MORLBF		;EXTRA FORCER LIBS
30100		JRST	.+2
30200		ADDM	TAC1,MORLBS		;EXTRA SAVER LIBS
30300		MOVE	SEARCH,STRGNM
30400		LSH	SEARCH,-7
30500		JRST	ADDCPM
30600	;*****ADD LIBS BEYOND NON-MOVER'S CAPTURED STONES
30700		SKIPN	FORSAV
30800		SKIPA	SEARCH,FSLIBS+3
30900		MOVE	SEARCH,FSLIBS
31000	ADDCPN:	JUMPE	SEARCH,ADDTHR
31100		MOVEM	SEARCH,STRGNM
31200		ANDI	SEARCH,177
31300		PUSHJ	PDP,NOCAPW
31400		MOVE	TAC1,NOLIBS
31500		SKIPE	FORSAV
31600		JRST	.+3
31700		ADDM	TAC1,MORLBS		;EXTRA SAVER LIBS
31800		JRST	.+2
31900		ADDM	TAC1,MORLBF		;EXTRA FORCER LIBS
32000		MOVE	SEARCH,STRGNM
32100		LSH	SEARCH,-7
32200		JRST	ADDCPN
32300	;*****SEE IF SAVERS LARGEST THREAT CAN WIN
32400	ADDTHR:	SKIPN	SEARCH,FSLIBS+4
32500		JRST	NOCAPF
32600		SETZ	ZER,
32700		MOVEI	TAC1,NWSTRG
32800		SKIPE	0(TAC1)
32900		AOJA	TAC1,.-1
33000		HRRM	TAC1,ADDTH2
33100	ADDTH1:	JUMPE	SEARCH,ADDTH3
33200		MOVEM	SEARCH,STRGNM
33300		ANDI	SEARCH,177
33400		PUSHJ	PDP,NOCAPW
33500		MOVE	SEARCH,STRGNM
33600		ANDI	SEARCH,177
33700		LDB	TAC5,[POINT 9,STRPTR(SEARCH),26]
33800		ADD	TAC5,NOLIBS
33900	ADDTH2:	SETZM	0			;RESETS NEW STRINGS LIST
34000		CAMGE	ZER,TAC5
34100		MOVE	ZER,TAC5		;ZER HOLDS BIGGEST THREAT
34200		MOVE	SEARCH,STRGNM
34300		LSH	SEARCH,-7
34400		JRST	ADDTH1
34500	ADDTH3:	HRRZ	TAC2,T2SAVE
34600		HLRZ	TAC5,LBSSTR-AFFMOV(TAC2)
34700		ADD	ZER,TAC5
34800		ADD	ZER,MORLBS
34900		CAMGE	ZER,CUTLBS
35000		JRST	NOCAPF-1
35100		CAMLE	ZER,CUTLB1
35200		TRO	16,STHRET		;SAVER "REAL" THREAT POINT
35300		SOJLE	TAC5,NOCAPF
35400		TLNE	16,FTWOLB
35500		TRO	16,SATTWO		;THREAT AND TWOLIB FOR SAVER
35600		JRST	NOCAPF
35700		TRO	16,NSTHRT		;MOVE NOT SAVER THREAT
35800	NOCAPF:	MOVE	FRIEND,NFRND
35900	;**********
36000	;	WE MUST FIND OUT WHETHER CONNECTING TO A NEW STRING MEANS WE
36100	;HAVE CONNECTED TO ONLY THIS STRING OR WHETHER THERE IS A WHOLE SET
36200	;OF FRIENDLY STRINGS BEHIND THE ONE WE SEE NOW.  THE PROGRAM CALCULATES
36300	;ALL NEW STRINGS AND THE NEW NEIGHBORS OF THESE STRINGS.  THE LIBERTIES
36400	;OF EACH STRING NOT IN THE CURRENT MOVE ARE ADDED AS AN ESTIMATE OF HOW
36500	;MANY NEW LIBS THE CURRENT MOVE CAN CONNECT TO.
36600	;**********
36700		SKIPN	NWSTRG
36800		JRST	NEWNG1
36900		TRO	16,NEWSTG	;MOVE SAW A NEW STRING
37000		TLNN	BWREG,CONTGT+NXTTGT
37100		JRST	NEWNG1		;ONLY ADD LIBS TO TARGET HELPERS
37200		MOVEI	TAC1,BRDWTH
37300		EXCH	TAC1,BNDCNS
37400		MOVEM	TAC1,TEMP1	;SAVE STRING COUNT
37500		MOVEI	TAC1,1
37600		MOVEM	TAC1,LIBSNO	;GET ATARIED CHASER STRINGS TOO
37700	;*****ADD NWSTRG LIST TO AFFECTED STRING LIST
37800		SKIPE	AFFSTR(TAC1)
37900		AOJA	TAC1,.-1
38000		MOVEM	TAC1,TEMP2	;SAVE END OF AFFECTED STRING LIST
38100		SETZ	TAC2,
38200	NEWNG2:	SKIPN	SEARCH,NWSTRG(TAC2)
38300		SOJA	TAC1,NEWNG3
38400		LDB	TAC3,[POINT 9,STRPTR(SEARCH),17]
38500		TDNN	FRIEND,GB1(TAC3)
38600		SAILERR <6>		;NEW STRINGS SHOULD ONLY BE FRIENDLY 
38700							;**** ERROR MESSAGE 6 ****
38800		MOVEM	SEARCH,AFFSTR(TAC1)
38900		AOJ	TAC2,
39000		AOJA	TAC1,NEWNG2
39100	NEWNG3:	SETZM	AFFSTR+1(TAC1)	;MARK END OF AUGMENTED LIST
39200	;*****CHECK THESE NEW STRINGS FOR NEIGHBORS
39300		CAMGE	TAC1,TEMP2
39400		JRST	NEWNG4-2
39500		HRRZ	SEARCH,AFFSTR(TAC1)	;GET STRING NAME
39600		PUSH	PDP,TAC1
39700		PUSHJ	PDP,NEIGHS
39800		POP	PDP,TAC1
39900		SOJA	TAC1,NEWNG3+1
40000	;*****FIND NUMBER OF ADDED LIBERTIES
40100		SETZ	TAC3,		;HOLDS # OF LIBS GAINED
40200		MOVE	TAC1,TEMP2
40300	NEWNG4:	SKIPN	SEARCH,AFFSTR(TAC1)
40400		JRST	NEWNG5
40500		SETZ	TAC2,
40600		SKIPN	TAC4,GRUPNO(TAC2)
40700		JRST	.+4
40800		CAME	TAC4,SEARCH
40900		AOJA	TAC2,.-3
41000		AOJA	TAC1,NEWNG4	;STRING IS PART OF PROPOSED MOVE
41100		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
41200		TDNN	FRIEND,GB1(TAC)
41300		AOJA	TAC3,NEWNG5-1	;ADD LIB FOR ATARIED CHASER
41400		LDB	TAC4,[POINT 9,STRPTR(SEARCH),35]
41500		SOJLE	TAC4,NEWNG5-1	;TAKE NOTE OF POSSIBLE DUPLICATION
41600		SOJLE	TAC4,NEWNG5-1
41700		ADD	TAC3,TAC4
41800		AOJA	TAC1,NEWNG4
41900	;*****FINISH UP AND RESTORE REGISTERS
42000	NEWNG5:	TLNE	16,NEWCGT
42100		SOSLE	TAC3		;COMPENSATE FOR DUP CONTGT POINT
42200		ADDM	TAC3,MORLBS	;ADD ON EXTRA NEIGHBOR LIBS
42300		MOVE	TAC1,TEMP2
42400		SETZM	AFFSTR(TAC1)	;RESTORE AFFECTED STRINGS LIST
42500		MOVE	TAC1,TEMP1
42600		MOVEM	TAC1,BNDCNS	;RESTORE STRING COUNT
42700	NEWNG1:	HRRZ	TAC2,T2SAVE	;RESTORE MOVE LIST INDEX
42800		HRRZ	TAC,BWREG	;RESTORE CURRENT BOARD OFFSET
42900		HRRZ	SEARCH,LBSSTR-AFFMOV(TAC2)
43000		HLRZ	TAC3,LBSSTR-AFFMOV(TAC2)
43100	;*****MARK ILLEGAL AND SELF-ATARI MOVES FOR BOTH FORCER AND SAVER.
43200	;*****ALSO ADD ON LIBERTIES FROM "CONNECTIONS" IF THE MOVE ALREADY
43300	;*****HAS AT LEAST TWO LIBERTIES ON ITS OWN
43400		CAIL	TAC3,2
43500		JRST	NOCAG1
43600		TRZ	16,SREVIV	;THIS IS NOT REAL REVIVAL
43700		TLNE	16,KOTAKS
43800		JRST	NOCAG1		;TAKES TWO MOVES TO RETAKE SAVER KO
43900		JUMPE	TAC3,.+3
44000		TLNN	BWREG,NXTTGT
44100		TLOA	16,SSATE	;SAVER SELF-ATE
44200		TLOA	16,SILLPT	;SAVER "ILLEGAL" MOVE
44300		TLNE	BWREG,CAPFRD+CAPENM
44400		SKIPN	TAC1,NOKVEC+4
44500		JRST	NOCAG2
44600		ADDM	TAC1,NOKVEC+11	;CAPTURED STONES ARE NEW LIBS
44700		CAILE	SEARCH,1
44800		TLO	BWREG,NATARI	;NOT REALLY SELF-ATARI FOR SAVER
44900		JRST	NOCAG2
45000	NOCAG1:	MOVE	TAC1,MORLBS	;LIBS FROM CONNECTION TO NEW STRINGS
45100		SKIPE	FORSAV
45200		JRST	.+3
45300		SKIPG	NOKVEC+11
45400		TRZ	16,STHRET	;FORCER MOVE+NO NEW SAVER LIBS=NO THREAT
45500		TRNE	16,STHRET
45600		ADDI	TAC1,1		;ADD ONE EXTRA LIBERTY FOR SAVER THREAT
45700		ADD	TAC3,TAC1
45800		ADDM	TAC1,NOKVEC+11
45900		ADDM	TAC1,NOKVEC+2		;# SAVER STRING LIBS
46000		HRLM	TAC3,LBSSTR-AFFMOV(TAC2)
46100		TLNN	BWREG,NXTTGT
46200		JRST	NCAG11
46300		MOVE	TAC1,TAC3		;WHEN NXTTGT, WE CAN SET
46400		SUB	TAC1,TGLIBS		;# "NEW" LIBS DIRECTLY
46500		MOVEM	TAC1,NOKVEC+11
46600	NCAG11:	SKIPN	TAC1,FSLIBS+4	;FORCER STRINGS THREATENED
46700		JRST	NOCAG2
46800		TRNE	TAC1,37600
46900		JRST	NOCAG2-1
47000		TLNN	16,FTWOLB
47100		JRST	NOCAG2
47200		TROA	16,SATTWO	;SAVER ATARIS AND TWOLIBS FORCER
47300		TRO	16,SDBLAT	;SAVER ATARIS TWO FORCER STRINGS
47400	NOCAG2:	CAIL	SEARCH,2
47500		JRST	NOCAG3
47600		TLNE	BWREG,NXTTGT
47700		TRO	16,SEMPT	;FORCER CANT GRACEFULLY MOVE HERE
47800		TRZ	16,SREVIV	;THIS REVIVAL DOESNT AFFECT FORCER
47900		TLNE	16,KOTAKF
48000		JRST	NOCAG4		;TAKES TWO MOVES TO RETAKE KO
48100		CAIE	SEARCH,1
48200		TLOA	16,FILLPT	;ILLEGAL MOVE FOR FORCER
48300		TLO	16,FSATE	;SELF-ATARI MOVE FOR FORCER
48400		JRST	NOCAG4
48500	NOCAG3:	MOVE	TAC1,MORLBF	;FORCER LIBS FROM BEYOND CAPTURE
48600		ADD	SEARCH,TAC1
48700		ADDM	TAC1,LBSSTR-AFFMOV(TAC2)
48800		ADDM	TAC1,NOKVEC+3		;# FORCER STRING LIBS
48900		MOVE	TAC1,FSLIBS+1	;SAVER STRINGS THREATENED BY FORCER
49000		TRNE	TAC1,37600
49100		TRO	16,FDBLAT	;FORCER THREATENS TWO STRINGS
49200		SKIPN	FORSAV
49300		TRNN	16,FTHRET
49400		JRST	NOCAG4
49500		MOVEI	TAC3,2(TAC3)		;BONUS FOR FORCER MAYLAD
49600		HRLM	TAC3,LBSSTR-AFFMOV(TAC2);THREAT ON TARGET STRING
49700		MOVEM	TAC3,NOKVEC+11		;THESE ARE NEW PSEUDO-LIBS
     

00100	;*****LINES 1 AND 2 ARE TO BE AVOIDED, ALL ELSE BEING EQUAL
00200	NOCAG4:	IDIVI	TAC,BRDWTH
00300		CAIE	TAC,1
00400		CAIN	TAC,BRDWTH-2
00500		JRST	NONLIN+1
00600		CAIE	TAC1,1
00700		CAIN	TAC1,BRDWTH-2
00800		JRST	NONLIN+1
00900		CAIE	TAC,2
01000		CAIN	TAC,BRDWTH-3
01100		JRST	NONLIN
01200		CAIN	TAC1,2
01300		JRST	NONLIN
01400		CAIE	TAC1,BRDWTH-3
01500		TLO	BWREG,NON2ND	;ABOVE SECOND LINE
01600	NONLIN:	TLOA	BWREG,NON1ST	;ON SECOND LINE
01700		TRZ	16,LADBRK	;NO LADDER BREAK ON FIRST LINE
01800		HRRZ	TAC,BWREG
01900	;*****LOOK AT LOW-LIBERTY MOVES AND POSSIBLE WINNERS
02000		SKIPN	FORSAV
02100		JRST	TRYEY2
02200		TLNE	16,SILLPT
02300		JRST	ILLPRP-1
02400		TLNE	16,SSATE
02500		JRST	NONIL1		;SAVER SELF-ATARI MOVE
02600		SKIPE	NOTWIN
02700		JRST	TRYEY3
02800		TLNN	BWREG,NXTTGT
02900		JRST	TRYEY4
03000		CAMG	TAC3,CUTLB1
03100		JRST	TRYEY3
03200	SAVXTD:	TLNE	BWREG,CAPENM+CAPFRD
03300		JRST	SAVCAP
03400		TLNE	BWREG,NXTTGT
03500		SKIPA	TAC5,[-11]	;SAVER WINS BY DIRECT EXTENSION
03600		MOVNI	TAC5,12		;SAVER WINS BY NON-EXTENSION MOVE
03700		JRST	STOPIT
03800	SAVCAP:	MOVNI	TAC5,4
03900		JRST	STOPIT		;SAVER WINNER BY CAPTURE OF CHASING STONES
04000	TRYEY4:	SKIPE	MSTSAV
04100		JRST	TRYEY3		;TARGET CAN BE LADDERED
04200		TLNE	BWREG,CONTGT
04300		SKIPE	SVCRIT
04400		JRST	TRYEY3
04500		CAMLE	TAC3,CUTLB2
04600		JRST	SAVXTD
04700	TRYEY3:	TLNE	16,FILLPT
04800		JRST	NOTRY0
04900		TLNN	16,FSATE
05000		JRST	NONIL1-1	;NOT ATARI FOR EITHER SIDE
05100		TLNN	BWREG,CAPFRD
05200		JRST	NONIL1
05300		JRST	NONIL1-1	;SAVES FRIENDLY STONES
05400	TRYEY2:	JUMPE	SEARCH,TRYEY1	;TRY FOR SAVER EYE
05500		SKIPG	TAC3
05600		JRST	NONIL1		;ILLEGAL MOVE FOR SAVER
05700		CAME	TAC,KOSAV1
05800		JRST	NOTKO
05900		TLO	16,FILLPT
06000		CAML	TAC4,CUTLB2
06100		SKIPE	NOTWIN
06200		JRST	ILLPRP-1
06300		MOVNI	TAC5,3		;LOSS BY KO
06400		JRST	STOPIT
06500	NOTKO:	TLNE	16,FSATE
06600		JRST	CONSTR		;FORCER SELF-ATARI POINT
06700		TLNN	BWREG,NXTTGT
06800		TLNN	16,SSATE
06900		JRST	NONIL1-1	;NEXT TARGET OR NOT SAVER SELF-ATE
07000		TLNN	BWREG,CAPFRD
07100		JRST	NONIL1
07200		JRST	NONIL1-1	;SAVES FRIENDLY STONES
07300	;*****THIS CODE TESTS FOR SAVER EYE
07400	TRYEY1:	CAIG	TAC3,1
07500		JRST	ILLPRP-1	;SAVER SELF-ATARI AND FORCER SELF-ATARI
07600	NOTRY0:	MOVEI	TAC1,BCON+WCON
07700		TDNE	TAC1,GBOARD(TAC)
07800		JRST	TRYEYE		;THIS IS FRIENDLY GROUP POINT
07900	NOTRY:	SKIPN	FORSAV
08000		JRST	ILLPRP-1	;ILLEGAL FORCER MOVE
08100		JRST	NONIL1-1
08200	TRYEYE:	TLNN	BWREG,CONTGT+NXTTGT
08300		JRST	NOTRY		;THIS POSSIBLE EYE NOT IN TARGET COMPLEX
08400		PUSHJ	PDP,EYDIAG
08500		CAIGE	TAC2,5		;TAC2 CONTAINS EYEMAKING SCORE
08600		JRST	NOTRY1
08700		HRRZ	TAC2,T2SAVE
08800		AOSG	EYECNT
08900		JRST	ILLPRP-1	;DONT PLAY ON OWN EYE
09000	TWOEYE:	MOVNI	TAC5,=13
09100		JRST	STOPIT		;TWO EYES STOP
09200	;*****SEE IF THIS POINT CAN BE MADE INTO AN EYE
09300	NOTRY1:	CAIL	TAC2,3
09400		JRST	.+3
09500		HRRZ	TAC2,T2SAVE	;CANT MAKE THIS AN EYE IN ONE MOVE
09600		JRST	NOTRY
09700		SETZM	REGSTR+1	;FLAG TO SEE IF CAN MAKE EYE
09800		MOVEI	TAC1,3
09900	NOTRY3:	HRRZ	TAC5,EYENUM(TAC1)
10000		JUMPE	TAC5,NOTRY4
10100		MOVEI	TAC3,AFFMOV
10200		HRRZ	TAC4,0(TAC3)
10300		JUMPE	TAC4,NOTRY2
10400		CAME	TAC4,TAC5
10500		AOJA	TAC3,.-3
10600	NOTRY7:	MOVE	TAC4,0(TAC3)
10700		TLO	TAC4,EYMAKE	;REWARD EYEMAKING POINT
10800		SKIPN	FORSAV
10900		JRST	.+3
11000		TLZE	TAC4,400000	;MAKE SURE THIS MOVE IS LEGAL FOR SAVER
11100		SOS	BNDCNL
11200		MOVEM	TAC4,0(TAC3)
11300		SETOM	REGSTR+1	;CAN MAKE EYE
11400		SKIPL	EYECNT
11500		SKIPN	FORSAV
11600		JRST	NOTRY2-1
11700		HRRZ	BWREG,0(TAC3)	;EYEMAKING POINT
11800		JRST	TWOEYE
11900	;*****LOOK FOR CAPTURABLE ENEMY STRING TO MAKE EYE
12000	NOTRY4:	MOVE	TAC5,@G1DIAG(TAC1)
12100		TRNE	TAC5,BLKOCC+WHTOCC
12200		TDNE	TAC5,FRIEND
12300		JRST	NOTRY2		;NOT ENEMY STRING POINT
12400		ANDI	TAC5,177
12500		LDB	TAC2,[POINT 9,STRPTR(TAC5),35]
12600		CAIE	TAC2,1
12700		JRST	NOTRY2		;TOO MANY LIBS IN ENEMY STRING
12800		MOVEI	TAC3,AFFMOV
12900	NOTRY5:	HRRZ	TAC,0(TAC3)
13000		JUMPE	TAC,NOTRY2-1	;CANT FIND THE LIBERTY
13100		MOVEI	TAC4,3
13200		LDB	TAC2,[POINT 7,@GB1TST(TAC4),35]
13300		CAIN	TAC2,TAC5
13400		JRST	NOTRY7		;FOUND THE STRING LIB
13500		SOJGE	TAC4,.-3
13600		AOJA	TAC3,NOTRY5
13700		HRRZ	TAC,BWREG	;RESTORE THE BOARD BASE REGISTER
13800	NOTRY2:	SOJGE	TAC1,NOTRY3
13900		HRRZ	TAC2,T2SAVE
14000		SKIPE	REGSTR+1
14100		JRST	ILLPRP-1	;MARK PROTO-EYE UNACCEPTABLE
14200		JRST	NOTRY		;THIS IS NOT A PROTO-EYE
14300		TLO	BWREG,NATARI	;NOT SELF-ATARI FOR SIDE MOVING
14400	NONIL1:	SUB	SEARCH,NOKVEC+10
14500		CAMGE	SEARCH,NOKVEC+2		;# SAVER STRING LIBS
14600		TLO	BWREG,WKSIDE	;NEAR FORCER WEAKNESS
14700	;*****NOTE CHANGE IN DEFINITION OF REGISTER "SEARCH"
14800		HLRZ	SEARCH,LBSSTR-AFFMOV(TAC2)	;"REAL" SAVER LIBS
14900	;**********
15000	;    EXPAND THE NUMBER OF MOVES CONNECTED TO THE TARGET COMPLEX BY CHECKING
15100	;A "REAL" NXTTGT OR CONTGT POINT FOR THESE CONDITIONS:
15200	;1.  FORCER HAS ≤2 LIBS NOW AND HAS NO SNAPBACK
15300	;2.  SAVER CAN MAKE A BAMBOO JOINT OR DIAGONAL CONNECTION NEARBY
15400	;3.  NEIGHBOR POINT IS "REAL" NXTTGT OR CONTGT AND NO SNAPBACK
15500	;    THE NEWCGT BIT IS TURNED ON IN AUXBTS TO NOTE ANY CONTGT AWARD BY	
15600	;THIS CODE.  LADBRK IS TURNED ON WHEN FORCER CAN CUT NEW MOVE OFF FROM
15700	;TARGET COMPLEX.  IF THE NEW MOVE IS NOT ON THE AFFECTED MOVES LIST AND
15800	;SAVER IS MOVING, THEN ADD THE MOVE TO THE LIST.
15900	;**********
16000		TLNE	BWREG,NXTTGT+CONTGT
16100		TLNE	16,NEWCGT		;DONT EXPAND "NEW" CONTGT
16200		JRST	SAVEX1+1
16300		SKIPE	SVCRIT
16400		JRST	SAVEX1+1
16500		MOVEI	BLANK,BNKOCC
16600		SETZM	TEMP1
16700		HRRZ	TAC1,NOKVEC+1		;# FORCER ACTUAL LIBS
16800		SUBI	TAC1,2
16900		JUMPLE	TAC1,.+2
17000		TLNN	16,SNACAP+SNACPN
17100		TLNE	16,SURCAP
17200		JRST	SAVX02			;SNAPBACK
17300		SKIPN	FORSAV
17400		JRST	SAVX02
17500		SOJL	TAC1,SAVEX2		;SAVER EXPANSION OK
17600		PUSHJ	PDP,NXCSRC
17700		JUMPE	TAC5,SAVX03+1		;ONLY DIAG IS POSSIBLE
17800		CAILE	TAC1,0
17900		AOSA	TEMP1			;FORCER CAN EASILY CUT
18000		SOS	TEMP1			;FORCER CAN POSSIBLY CUT
18100	;*****BAMBOO JOINT AVAILABILITY CHECK
18200	SAVX02:	MOVEI	TAC4,3
18300		TDNE	FRIEND,@G1DIAG(TAC4)
18400		TDNN	FRIEND,@G1DIAG+1(TAC4)
18500		JRST	SAVX03
18600		TDNN	BLANK,@GB1TST(TAC4)
18700		JRST	SAVX03
18800		TDNE	FRIEND,@GB1TST+1(TAC4)
18900		TDNN	BLANK,@GB1TST+3(TAC4)
19000		JRST	.+2
19100		JRST	SAVX04
19200		TDNE	FRIEND,@GB1TST+3(TAC4)
19300		TDNN	BLANK,@GB1TST+1(TAC4)
19400		JRST	SAVX03
19500	SAVX04:	SETOM	TEMP1			;DONT COUNT THIS AS WINNER
19600		JRST	SAVEX2			;AT BAMBOO JOINT
19700	SAVX03:	SOJGE	TAC4,SAVX02+1
19800	;*****DIAGONAL CONNECTION AVAILABILITY CHECK
19900		MOVEI	TAC1,3
20000	SAVX06:	TDNN	FRIEND,@GB1TST(TAC1)
20100		JRST	SAVX05
20200		LDB	TAC3,[POINT 7,@GB1TST(TAC1),35]
20300		MOVEI	TAC4,AFFSTR+1
20400		HRRZ	TAC5,0(TAC4)
20500		JUMPE	TAC5,SAVX05		;"FRIEND" NOT AN AFFECTED STRING
20600		CAME	TAC5,TAC3
20700		AOJA	TAC4,.-3
20800		MOVEI	TAC,@GODOWN(TAC1)
20900		MOVEI	TAC4,3
21000	SAVX07:	TDNE	BLANK,@GB1TST(TAC4)
21100		TDNN	BLANK,@GB1TST+1(TAC4)
21200		JRST	SAVX05-2
21300		TDNN	BLANK,@G1DIAG+1(TAC4)
21400		JRST	SAVX05-2
21500		MOVEI	TAC,@G1DIAG+1(TAC4)
21600		SUBI	TAC,GB1		;SET TAC AT DIAG POINT
21700		SETO	TAC1,		;DISABLE SAVEX2 LOOP
21800		SETZM	TEMP1		;POINT CAN BE SAVER WINNER
21900		JRST	SAVX22
22000		SOJGE	TAC4,SAVX07
22100		HRRZ	TAC,BWREG
22200	SAVX05:	SOJGE	TAC1,SAVX06
22300		SKIPN	TEMP1
22400		JRST	SAVEX1+1		;DONT EXPAND THIS POINT
22500	;*****EXPANSION/CONTGT AWARDING LOOP
22600	SAVEX2:	MOVEI	TAC1,3
22700		TDNN	BLANK,@GB1TST(TAC1)
22800		JRST	SAVEX1
22900		MOVEI	TAC,@GODOWN(TAC1)
23000	SAVX22:	SETZ	REPLCE,
23100		MOVEI	TAC4,AFFMOV
23200		SKIPN	TAC5,0(TAC4)
23300		JRST	SAVEX3			;MOVE NOT ON MOVE LIST
23400		CAIE	TAC,0(TAC5)
23500		AOJA	TAC4,.-3
23600		TLNN	TAC5,NXTTGT
23700		JRST	SAVEX4
23800		TROA	16,SEMPT	    ;DEMOTE CURRENT NXTTGT POINT TO CONTGT
23900	SAVEX3:	SKIPN	FORSAV
24000		JRST	SAVEX1-1		;DONT EXPAND FORCER MOVE LIST
24100		SOSG	BNDCNL
24200		JRST	LEXCSS
24300		PUSHJ	PDP,TACMRK
24400		MOVE	TAC5,TAC
24500		SETZM	1(TAC4)			;NEW END FOR AFFECTED MOVE LIST
24600	SAVEX4:	TLON	TAC5,CONTGT
24700		TLO	REPLCE,NEWCGT		;"NEW" CONTGT POINT
24800		SKIPGE	TAC3,TEMP1
24900		JRST	SAVX41
25000		JUMPE	TAC3,SAVX41+1
25100		TLZE	REPLCE,NEWCGT
25200		TLZ	TAC5,CONTGT
25300	SAVX41:	TRO	REPLCE,LADBRK
25400		SKIPL	TAC1		;DON'T SEMPT FOR DIAGONAL CONNECTION
25500		TRO	16,SEMPT
25600		MOVEM	TAC5,0(TAC4)
25700		ORM	REPLCE,AUXBTS-AFFMOV(TAC4)
25800		HRRZ	TAC,BWREG
25900	SAVEX1:	SOJGE	TAC1,SAVEX2+1
26000	;*****TRY FOR INSTANT LOSERS AND WINNERS
26100		TLNE	BWREG,NXTTGT
26200		CAILE	SEARCH,1
26300		JRST	ACCEP1
26400		SKIPE	FORSAV
26500		JRST	ILLPRP		;TOT LIBS COUNT IS ONLY ONE
26600	ACCEP1:	SKIPN	SVCRIT
26700		SKIPE	NOTWIN
26800		JRST	NFRCR
26900	;**********
27000	;	LOOK FOR WINNING MOVES FOR SAVER.  THIS MEANS A MOVE
27100	;WHICH GIVES THE TARGET MORE THAN THE "ESCAPE" NUMBER OF
27200	;LIBERTIES.  FORCER GIVES UP IF THERE ARE THREE OR MOVE WAYS FOR
27300	;SAVER TO WIN.
27400	;**********
27500		TLNE	BWREG,NXTTGT+CONTGT
27600		TRNE	16,LADBRK
27700		JRST	NFRCR
27800		CAMG	SEARCH,CUTLBS	;CHECK FOR INSTANT WINNER
27900		JRST	NFRCR		;TOTAL LIBS OF SAVER <4
28000		SKIPE	FORSAV
28100		JRST	ACCSAV		;MAY BE A SAVER WINNER
28200		CAMGE	SEARCH,CUTLB2
28300		JRST	NFRCR		;NOT A FORCER FORCE
28400		SKIPN	TAC1,FSLIBS+3
28500		JRST	ACCSV2+2
28600	;*****THIS MOVE WINS BY CAPTURING STONES
28700		TLNE	16,LADLSM
28800		JRST	SAVXTD		;FORCER MUST SAVE DEAD STRING
28900		TLNE	16,FILLPT+FSATE
29000		JRST	ILLPRP-1	;REALLY BAD FORCER MOVE
29100		AOS	SAVWN1
29200		CAIL	TAC1,177
29300		JRST	ACCSV2-2
29400		TRNN	16,LADLOS
29500		JRST	ACCSV2
29600		CAMN	TAC1,MSTSAV	;LADDERED STRING NAME
29700		SOSA	SAVWN1		;COUNTS LADDER WINNERS
29800		MOVEM	TAC1,MSTSAV
29900		JRST	ACCSV1
30000	ACCSV2:	MOVEM	TAC1,MUSTSV	;DIRECT CAPTURE STRING NAME
30100		JRST	ACCSV1
30200		TLNE	16,FILLPT+FSATE
30300		JRST	SAVXTD
30400	;*****SAVE TARGET COMPLEX EXTENSION
30500	ACCSV1:	SKIPN	XTDFRC
30600		JRST	ACCSAV-1
30700		SKIPN	XTDFR1
30800		JRST	ACCSAV-3
30900	TWOPRB:	MOVNI	TAC5,14		;***TOO MANY WINNERS LOSS
31000		JRST	SEXCSS+1
31100		HRRZM	BWREG,XTDFR1
31200		JRST	ACCSAV
31300		HRRZM	BWREG,XTDFRC
31400	;*****RECORD EXTENSION TYPE
31500	ACCSAV:	AOS	SAVWIN
31600		TLNE	BWREG,NXTTGT
31700		SOSA	CONFLG		;NEXT-TO-TARGET WINNER
31800		ADDM	TAC2,CONFLG
31900		SKIPN	FORSAV
32000		JRST	NFRCR
32100		TLNN	BWREG,NON1ST	;ON FIRST LINE?
32200		JRST	.+3
32300		TLNE	BWREG,NON2ND	;ON SECOND LINE?
32400		SKIPE	MSTSAV		;CAN TARGET BE LADDERED?
32500		SOSA	SAVWIN		;DONT COUNT THIS "WINNER"
32600		JRST	SAVXTD
32700	;**********
32800	;	CALCULATE THE NUMBER OF NEW LIBERTIES THE MOVE BRINGS TO
32900	;THE TARGET COMPLEX.  THIS IS DONE MORE OR LESS EXACTLY FOR MOVES
33000	;NEXT TO THE TARGET AND MOVES NEXT TO THE TARGET COMPLEX.  OTHER
33100	;MOVES ARE WORKED ON ONLY IF THEY HAVE SOME SPECIAL PROPERTY.
33200	;**********
33300	NFRCR:	TLNE	BWREG,NXTTGT
33400		TLZ	BWREG,CONTGT	;ELIMINATE NXTTGT+CONTGT DUPLICATION
33500		TLNE	BWREG,NXTTGT+CONTGT
33600		TRZ	16,SREVIV	;ELIMINATE CONTGT+SREVIV DUPLICATION
33700		TLNE	16,LADLSM+LADLSN
33800		JRST	ACCEPT		;DONT PLAY ON LADDER LOSS POINT
33900		MOVE	REPLCE,NOKVEC+11	;ESTIMATE OF "NEW" LIBERTIES
34000		TLNE	BWREG,NXTTGT
34100		JRST	NFRCR0
34200		TLNE	BWREG,CONTGT
34300		JRST	.+3
34400		TRNN	16,SATTWO+FDBLAT
34500		JRST	ACCEPT-1
34600		TLNN	BWREG,TWOATE
34700		JRST	NFRCR0-1
34800		SKIPE	NWSTRG
34900		JRST	NFRCR0
35000		JUMPE	REPLCE,NFRCR1-1
35100		SUBI	REPLCE,1	;DISCOURAGE CONTGT BY ONE LIB
35200	NFRCR0:	CAMG	SEARCH,REPLCE
35300		SOJA	REPLCE,NFRCR0	;MUST HAVE "NEW" LIBS < TOTAL LIBS
35400		TLNN	BWREG,EYMAKE
35500		JUMPL	REPLCE,NFRCR1
35600		JUMPG	REPLCE,.+4
35700		TLO	BWREG,NREDUC
35800	NFRCR1:	TRO	16,SEMPT
35900		JRST	ACCEPT
36000		CAIGE	REPLCE,3
36100		JRST	NFRC31
36200	;*****SEE IF LAST FORCER MOVE HELPED SAVER BY ALLOWING SAVER TO
36300	;*****CAPTURE IT AND GAIN ≥3 LIBERTIES AT THE SAME TIME
36400		SKIPE	FORSAV
36500		SKIPN	TAC1,FSLIBS+3
36600		JRST	NFRCR3
36700		MOVE	TAC5,NDXFOR
36800		CAILE	TAC5,5
36900		CAIL	TAC1,177	;>1 CAPTURED STRING
37000		JRST	NFRCR3		;FORCER HASNT MOVED YET
37100		LDB	TAC4,[POINT 9,STRPTR(TAC1),17]
37200		ADD	TAC5,PNTDPY
37300		CAME	TAC4,-5(TAC5)
37400		CAMN	TAC4,-4(TAC5)
37500		JRST	NFRCR3-2
37600		CAMN	TAC4,-3(TAC5)
37700		JRST	NFRCR3-2
37800		CAME	TAC4,-2(TAC5)
37900		JRST	NFRCR3
38000		MOVNI	TAC5,7		;THIS GOOD MOVE CAPTURES THE LAST
38100		JRST	STOPIT		;FORCER MOVE, "REFUTING" IT.
38200	NFRCR3:	CAIG	REPLCE,3
38300		JRST	NFRC31
38400		TLO	BWREG,EYMAKE	;≥4 NEW LIBERTIES IS AT LEAST
38500		SUBI	REPLCE,3	;AS GOOD AS MAKING AN EYE
38600		CAILE	REPLCE,3
38700		MOVEI	REPLCE,3
38800	NFRC31:	TRNE	REPLCE,1
38900		TLO	BWREG,NEWLIB		;NOTE MOVE ADDS NEW LIB
39000		TRNE	REPLCE,2
39100		TLO	BWREG,NWLIB2		;NOTE MOVE ADDS 2 NEW LIBS
39200		TLO	BWREG,NREDUC
39300	;*****THERE MUST BE A CERTAIN MINIMUM OF LIBERTIES FOR SEVERAL BITS
39400	;*****TO MAKE SENSE.  A LIBERTIES VIOLATION DETECTED BELOW TURNS OFF
39500	;*****THE BIT IN CASE IT HAS BEEN SET.
39600	ACCEPT:	HRRZ	TAC5,NOKVEC		;SAVER LIBS
39700		HRRZ	TAC4,NOKVEC+1		;FORCER LIBS
39800	;*****MAKE NEW WKNTGT STRING?
39900		TLNE	16,FTWOLB
40000		TRNE	16,STHRET+NSTHRT
40100		JRST	ACEPT2
40200		CAIGE	TAC5,3
40300		TLNE	BWREG,TWOATE
40400		TLO	BWREG,WKNTGT
40500	;*****IS THIS GOOD POINT FOR BOTH SIDES?
40600		CAIL	TAC4,4
40700		CAIGE	TAC5,3
40800		JRST	ACEPT2
40900		TLNN	BWREG,WKNTGT
41000		JRST	ACEPT2
41100		TLOE	BWREG,NEWLIB		;GOOD POINT FOR BOTH GETS EXTRA
41200		TLO	BWREG,NWLIB2		;LIB TO REPRESENT ITS URGENCY
41300	ACEPT2:	TLNE	16,LADLSM
41400		JRST	ACEPT1		;LADDER LOSS POINT
41500		SKIPE	FORSAV
41600		JRST	.+5
41700		TLNE	16,FSATE
41800		TLNE	16,KOTAKF
41900		JRST	ACEPT1+1	;KO TAKE OR NOT SELF ATE
42000		JRST	ACEPT1
42100		TLNN	16,SSATE
42200		JRST	ACEPT1+1
42300		TLNN	16,KOTAKS
42400	ACEPT1:	TLZ	BWREG,CAPFRD+THRTGS	;AIDS FORWARD PRUNING
42500		SKIPN	FORSAV
42600		TLNN	BWREG,SAVTGS
42700		JRST	ACEPT3
42800		CAIN	TAC5,2
42900		TLO	16,FORHLP	;SAVER ATARIES FORCER HERE
43000	ACEPT3:	MOVEM	16,AUXBTS-AFFMOV(TAC2)
43100		MOVEM	BWREG,0(TAC2)
43200		AOJA	TAC2,PRPLOP
     

00100	;*****SEE ABOUT MAKING EYES WITH PROPOSED MOVES.  CONSIDER THE CASE OF
00200	;*****CAPTURING NO MEN OR EXACTLY ONE MAN.
00300	BUBLP2:	MOVEI	TAC4,AFFMOV
00400		MOVE	FRIEND,NFRND		;NOTE THAT EYCHEK REQUIRES THAT
00500		XORI	FRIEND,BLKOCC+WHTOCC   ;FRIEND MATCHES ENEMY OCCUPIED POINT
00600	BUBL21:	HRRZ	TAC1,LBSSTR-AFFMOV(TAC4)	;FORCER LIBS
00700		SKIPN	TAC,0(TAC4)
00800		JRST	BUBLPX
00900		TLNN	TAC,NXTTGT+CONTGT
01000		AOJA	TAC4,BUBL21	;NOT NXTTGT OR CONTGT SO CANT MAKE EYE
01100		CAIN	TAC1,1
01200		JRST	EYEMKA		;FOUND TIGERMOUTH
01300	EYEMKH:	SKIPE	FORSAV
01400		SKIPA	TAC1,[CAPENM*1000000]
01500		HRLZI	TAC1,CAPFRD
01600		TDNN	TAC,TAC1
01700	EYEMKB:	AOJA	TAC4,BUBL21
01800		HRRZ	TAC,TAC			;FOUND ATARI OF FORCER POINT
01900		MOVEM	TAC,TACSV1	;USED BY EYCHEK
02000		MOVEI	TAC1,3
02100	EYEMKD:	MOVE	SEARCH,@GB1TST(TAC1)
02200		TRNE	SEARCH,BLKOCC+WHTOCC
02300		TDNE	SEARCH,NFRND
02400		JRST	EYEMKC
02500		ANDI	SEARCH,177
02600		MOVE	TAC3,STRPTR(SEARCH)
02700		TRNN	TAC3,776000		;ONE-MAN STRING
02800		TRNE	TAC3,776		;ONE-LIB STRING
02900		JRST	EYEMKC
03000		MOVE	REPLCE,TAC4		;INDEX OF TO-BE-REWARDED POINT
03100		MOVEI	TAC,@GODOWN(TAC1)
03200		JRST	EYEMKG
03300	EYEMKC:	SOJGE	TAC1,EYEMKD
03400		AOJA	TAC4,BUBL21
03500	EYEMKA:	MOVE	TAC1,NFRND
03600		CAIE	TAC1,BLKOCC
03700		SKIPA	TAC1,[WCON]
03800		MOVEI	TAC1,BCON
03900		TDNN	TAC1,GBOARD(TAC)
04000		JRST	EYEMKH			;NOT GROUP POINT, TRY FOR CAPTURE
04100		HRRZ	TAC,TAC
04200		MOVEI	TAC2,3
04300		MOVEI	BLANK,BNKOCC		;FIND BLANK NEXT TO CURRENT POINT
04400		TDNN	BLANK,@GB1TST(TAC2)
04500		SOJGE	TAC2,.-1
04600		JUMPL	TAC2,BUBL21+1		;NO BLANK, TRY FOR CAPTURE
04700		MOVEI	REPLCE,AFFMOV
04800		HRRZ	TAC3,0(REPLCE)
04900		JUMPE	TAC3,BUBL21+1
05000		CAIE	TAC3,@GODOWN(TAC2)	;FOUND INDEX FOR REWARD POINT
05100		AOJA	REPLCE,.-3
05200		MOVEM	TAC3,TACSV1	;USED BY EYCHEK
05300	EYEMKG:	PUSHJ	PDP,EYCHEK
05400		CAIE	TAC1,2000
05500		AOJA	TAC4,BUBL21	;PLAY DOES NOT MAKE EYE
05600		MOVE	TAC5,0(REPLCE)
05700		TLO	TAC5,EYMAKE		;REWARD EYEMAKING POINT
05800		TLOE	TAC5,NREDUC
05900		SKIPE	FORSAV
06000		JRST	EYEMKX
06100		MOVE	TAC3,NDXFOR
06200		CAILE	TAC3,=10
06300		CAME	REPLCE,TAC4
06400		JRST	EYEMKX
06500	;*****SEE IF EYEMAKING CAPTURE WAS LAST FORCER MOVE
06600		ADD	TAC3,PNTDPY
06700		CAME	TAC,-=10(TAC3)
06800		CAMN	TAC,-=9(TAC3)
06900		JRST	EYEMKX-2
07000		CAMN	TAC,-=8(TAC3)
07100		JRST	EYEMKX-2
07200		CAME	TAC,-=7(TAC3)
07300		JRST	EYEMKX
07400		MOVNI	TAC5,=14	;THIS GOOD MOVE MAKES AN EYE WITHOUT
07500		JRST	STOPIT		;LOSING A LIBERTY.  FURTHERMORE, THE
07600					;CAPTURE IS OF FORCER'S LAST MOVE.
07700	EYEMKX:	MOVE	TAC3,AUXBTS-AFFMOV(REPLCE)
07800		TLNE	TAC3,LADLSM+LADLSN
07900	;*****SHOULD CHECK TO SEE IF LADDER LOSS CAN WRECK EYE
08000		JRST	EYEMKZ		;INSTANT LADDER LOSS DOESNT STOP EYE
08100		SKIPN	FORSAV
08200		JRST	.+3
08300		TLZE	TAC5,400000	;MAKE SURE MOVE LEGAL FOR SAVER
08400		SOS	BNDCNL
08500		MOVEM	TAC5,0(REPLCE)
08600	EYEMKZ:	CAMN	TAC4,REPLCE
08700		JRST	EYEMKY
08800		MOVE	TAC5,0(TAC4)
08900		TLZ	TAC5,377777-(NXTTGT+CONTGT+WKNTGT)
09000		TLON	TAC5,400000
09100		AOS	BNDCNL
09200		MOVEM	TAC5,0(TAC4)	;DONT PLAY INTO EYE POINT
09300	EYEMKY:	SKIPL	EYECNT
09400		SKIPN	FORSAV
09500		AOJA	TAC4,BUBL21
09600		HRRZ	BWREG,0(REPLCE)
09700		JRST	TWOEYE
09800	;**********
09900	;	ADJUST SOME BITS IN THE LEFT HALF OF THE AVAILABLE MOVE LIST (IE.,
10000	;AFFECT SCORING AND MOVE PRUNING) IF CERTAIN SPECIAL SORTS OF PROPERTIES
10100	;ARE DETECTED FOR A MOVE.
10200	;**********
10300	BUBLPX:	MOVEI	TAC2,AFFMOV
10400		SKIPN	TAC4,0(TAC2)
10500		JRST	BUBLX1
10600		MOVE	TAC3,AUXBTS-AFFMOV(TAC2)
10700		TRNE	TAC3,SDBLAT+SATTWO
10800		TLZ	TAC4,WKNTGT	;HAVING LIBS IS BETTER THAN HAVING WKNTGT
10900		TRNN	TAC3,SDBLAT
11000		JRST	.+4
11100		SKIPE	FORSAV
11200		TLOA	TAC4,CAPENM	;SAVER CAPTURES SOMETHING
11300		TLO	TAC4,CAPFRD	;FORCER PREVENTS SAVER CAPTURE
11400		TRNN	TAC3,FDBLAT
11500		JRST	.+4
11600		SKIPN	FORSAV
11700		TLOA	TAC4,CAPENM	;FORCER CAPTURES SOMETHING
11800		TLO	TAC4,CAPFRD	;SAVER PREVENTS FORCER CAPTURE
11900	;*****DEMOTE BAD NXTTGT MOVES BY MAKING THEM CONTGT INSTEAD
12000		TRNN	TAC3,SEMPT
12100		JRST	BUBLX5
12200		SKIPE	FORSAV
12300		JRST	.+3
12400		TLNE	TAC4,THRTGS
12500		JRST	BUBLX5		;FORCER IS CLOSING IN ON TARGET
12600		TLZE	TAC4,NXTTGT
12700		TLO	TAC4,CONTGT
12800	;*****SEE IF MOVE HELPS FORCER PLAY ON FORCER SELF-ATARI POINT
12900	BUBLX5:	TRNN	TAC3,HLPSTR
13000		JRST	BUBLX2
13100		HRRZ	TAC1,LBSSTR-AFFMOV(TAC2)
13200		CAIG	TAC1,2
13300		JRST	BUBLX2
13400		TLO	TAC4,CONTGT
13500		TLNN	TAC4,NWLIB2+NEWLIB
13600		TLO	TAC4,NEWLIB
13700	;*****MAKE SURE SPECIAL SAVER MOVES AND THREATS ARE NOTICED
13800	BUBLX2:	TLNE	TAC4,NWLIB2+NEWLIB+EYMAKE
13900		JRST	BUBLX6			;MOVE ALREADY WELL DONE
14000		TRNE	TAC3,SATTWO+SDBLAT+SREVIV
14100		JRST	BBLX20
14200		TRNE	TAC3,LADBRK
14300		JRST	BUBLX6-1		;LADDER-BREAKING PLAY
14400		JRST	BUBLX6
14500	BBLX20:	TRNE	TAC3,NSTHRT
14600		JRST	BUBLX6
14700		HLRZ	TAC1,LBSSTR-AFFMOV(TAC2)	;SAVER LIBS
14800		SOJLE	TAC1,BUBLX6
14900		TRNE	TAC3,SDBLAT
15000		AOJA	TAC1,BBLX21	;USE ALL LIBS IN DOUBLE ATARI CASE
15100		TRNE	TAC3,NLADDR
15200		JRST	BUBLX6-1	;LADDER DOESNT WORK
15300	BBLX21:	TRNE	TAC3,STHRET
15400		CAIG	TAC1,3
15500		JRST	BBLX22
15600		TLO	TAC4,EYMAKE	;>3 LIBS "AS GOOD AS" EYE
15700		SUBI	TAC1,3
15800		CAILE	TAC1,3
15900		MOVEI	TAC1,3
16000	BBLX22:	TRNE	TAC1,2
16100		TLO	TAC4,NWLIB2
16200		TRNE	TAC1,1
16300		TLO	TAC4,NEWLIB
16400	;*****SEE IF FORCER CAN PREVENT SAVER ATARI
16500	BUBLX6:	TLNN	TAC3,FORHLP
16600		JRST	BUBLX4+1
16700		SETZ	TAC,
16800	BUBLX3:	HRRZ	TAC1,AFFMOV(TAC)
16900		JUMPE	TAC1,BUBLX4+1
17000		SUBI	TAC1,0(TAC4)
17100		MOVM	TAC1,TAC1
17200		CAIE	TAC1,BRDWTH
17300		SOJN	TAC1,BUBLX4
17400		HRRZ	TAC1,LBSSTR(TAC)
17500		CAIG	TAC1,1
17600		JRST	BUBLX4
17700		HRLZI	TAC1,TWOATE	;THIS MOVE PREVENTS A SAVER ATARI
17800		ORM	TAC1,AFFMOV(TAC)
17900	BUBLX4:	AOJA	TAC,BUBLX3
18000		MOVEM	TAC4,0(TAC2)
18100		AOJA	TAC2,BUBLPX+1
18200	;*****A PITCH (SACRIFICE) IS PROPOSED AS A GOOD MOVE TO TRY IF THERE
18300	;*****IS NO WAY ACCEPTING THE SACRIFICE CAN BE GOOD FOR THE SAVING SIDE.
18400	;*****NOTE A PITCH SPOT MAY BE A GOOD PLACE FOR THE SAVER TO PLAY ALSO.
18500	BUBLX1:	MOVEI	TAC2,AFFMOV
18600	PITCH2:	SKIPN	TAC1,0(TAC2)
18700		JRST	PITCH1+1
18800		JUMPL	TAC1,.+2
18900		TLNN	TAC1,NWLIB2+NEWLIB
19000		AOJA	TAC2,PITCH2
19100		MOVE	TAC3,AUXBTS-AFFMOV(TAC2)
19200		TLNE	TAC3,FSATE
19300		TRNE	TAC3,NEWSTG
19400		AOJA	TAC2,PITCH2
19500		MOVEI	TAC4,1		;SEE IF CAPTURE HELPS SAVER TARGET
19600	PITCH3:	HRRZ	TAC5,AFFMOV-1(TAC4)
19700		JUMPE	TAC5,PITCH1	;MOVE LIST EXHAUSTED
19800		SUBI	TAC5,0(TAC1)
19900		MOVM	TAC5,TAC5
20000		CAIN	TAC5,BRDWTH
20100		JRST	.+3
20200		CAIE	TAC5,1
20300		AOJA	TAC4,PITCH3
20400		MOVE	TAC5,AFFMOV-1(TAC4)
20500		TLNE	TAC5,NXTTGT+CONTGT
20600		TLNE	TAC5,EYMAKE+NWLIB2+NEWLIB
20700		JRST	PITCH1		;CAPTURE DOES HELP SAVER
20800		SKIPN	FORSAV
20900		JRST	.+3
21000		TLNE	TAC5,NREDUC	;SAVER MOVING AND
21100		JRST	PITCH1		;CAPTURE DOESNT HURT SAVER
21200		TLNN	TAC1,WKNTGT
21300		JRST	PITCH1-2
21400		SKIPE	FORSAV
21500		JRST	PITCH4
21600		TLNE	TAC5,SAVTGS
21700		JRST	PITCH1		;CAPS >1 AND THREATENS, TOO
21800		JRST	PITCH1-2
21900	PITCH4:	TLNE	TAC5,THRTGS
22000		JRST	PITCH1		;CAPS >1 AND THREATENS, TOO
22100		TLO	TAC1,NREDUC+NATARI+NEWLIB+NWLIB2
22200		MOVEM	TAC1,0(TAC2)	;PITCH IS NOW A GOOD MOVE
22300	PITCH1:	AOJA	TAC2,PITCH2
22400		SETZM	BKFLAG		;*****USED TO DENOTE EXCEPTIONAL CONDITION
22500		SKIPN	FORSAV
22600		JRST	FORCUT
22700	;**********
22800	;	THIS PRUNING LOOP GETS RID OF ALL OBVIOUSLY BAD SAVING MOVES.
22900	;THE ONLY CLEAR-CUT CASE IS WHEN SAVER IS THREATENED.
23000	;**********
23100	SVMODE:	MOVEI	TAC2,AFFMOV	;GET RID OF USELESS SAVER MOVES
23200		HRLZI	TAC3,777777-(NREDUC+NATARI+NON1ST+NON2ND+WKSIDE)
23300		SKIPN	TAC4,MSTSAV
23400		JRST	SAVCLP
23500		MOVEI	TAC4,SDBLAT+SATTWO
23600		SKIPG	MSTSAV
23700		TLZA	TAC3,777777-(NXTTGT+CONTGT)	;LADDER AGAINST TARGET
23800		TLZA	TAC3,777777-CAPFRD		;SNAPBACK AGAINST TARGET
23900		TRO	TAC4,LADBRK
24000	SAVCLP:	SKIPN	TAC5,0(TAC2)
24100		JRST	BUBLOP-2
24200		JUMPL	TAC5,.+3
24300		TDNN	TAC5,TAC3
24400		TDNE	TAC4,AUXBTS-AFFMOV(TAC2)
24500		AOJA	TAC2,SAVCLP
24600		TLO	TAC5,400000
24700		MOVEM	TAC5,0(TAC2)	;THIS IS A LEGAL BUT USELESS MOVE
24800		AOS	BNDCNL
24900		AOJA	TAC2,SAVCLP
25000	
25100	;**********
25200	;	THERE ARE SEVERAL CASES WHERE IS IT CLEAR WHAT THE FORCING SIDE
25300	;MUST DO IN ORDER TO PROCEDE.  THESE CONDITIONS LEAD TO THE PRUNING
25400	;SEEN BELOW.
25500	;**********
25600	FORCUT:	SETZ	TAC3,	;IF SAVER WINNER, THEN CUT OUT IRRELEVANT MOVES
25700		SETZ	TAC4,
25800		SKIPN	MSTSAV
25900		SKIPE	MUSTSV
26000		JRST	FORCU1		;MUST SAVE FRIENDLY STONES
26100		SKIPN	SAVWIN
26200		JRST	FORCLP-2	;ONLY CUT OUT TRIVIAL MOVES FOR FORCER
26300		SKIPL	CONFLG
26400		TLOA	TAC3,NXTTGT+CONTGT	;SAVER WINS BY CONTGT EXTENSION
26500		TLO	TAC3,NXTTGT	;SAVER WINS BY NXTTGT EXTENSION
26600		JRST	FORCLP-1
26700	FORCU1:	TLO	TAC3,CAPFRD	;SAVER WINS BY CAPTURE
26800		TLOA	TAC4,NEWLIB+NWLIB2+CONTGT+NREDUC
26900					;THE REASON THESE BITS ARE IGNORED IS
27000					;THAT THE PROGRAM ALWAYS CALCULATES IN
27100					;TERMS OF ADDED SAVER LIBS, AND THIS IS
27200					;IRRELEVANT WHEN FORCER IS SAVING HIMSELF
27300		HRLZI	TAC3,777777-(NREDUC+NATARI+NON1ST+NON2ND+WKSIDE)
27400		MOVEI	TAC2,AFFMOV
27500	FORCLP:	SKIPN	TAC5,0(TAC2)
27600		JRST	FORCL1+2
27700		JUMPL	TAC5,FORCL1+1
27800		TDZ	TAC5,TAC4	;IRRELEVANT BITS
27900		TDNE	TAC5,TAC3
28000		JRST	FORCL1
28100		TLO	TAC5,400000
28200		AOS	BNDCNL		;THIS MOVE IS IRRELEVANT
28300	FORCL1:	MOVEM	TAC5,0(TAC2)
28400		AOJA	TAC2,FORCLP
28500		MOVE	TAC4,BNDCNL
28600		CAIGE	TAC4,MXMVES
28700		JRST	BUBLOP-2
28800	;*****NO ACCEPTABLE MOVES LEFT, SO RE-TRY THE NOT-TOO-BAD ONES
28900		MOVEI	TAC2,AFFMOV
29000	NOCTF1:	SKIPN	TAC1,0(TAC2)
29100		JRST	BUBLOP-2
29200		JUMPL	TAC1,.+2
29300		SAILERR <7>		;******** ERROR MESSAGE 7 ********
29400		TLNN	TAC1,377777-(NXTTGT+CONTGT+WKNTGT)
29500		AOJA	TAC2,NOCTF1	;THIS MOVE IS HOPELESS
29600		TLZ	TAC1,400000
29700		MOVEM	TAC1,0(TAC2)	;THIS MOVE MIGHT BE OK
29800		SOS	BNDCNL
29900		AOJA	TAC2,NOCTF1
30000	
30100	;**********
30200	;	BUBBLE SORT THE REMAINING LEGAL MOVE CANDIDATES TO DETERMINE
30300	;HEURISTIC ORDER FOR THE LOOKAHEAD.
30400	;**********
30500		MOVEI	TAC1,AFFMOV
30600		SETZ	TAC4,
30700	BUBLOP:	CAIGE	TAC2,2(TAC1)
30800		JRST	BUBLP1
30900		MOVE	TAC3,0(TAC1)
31000		CAML	TAC3,1(TAC1)
31100		AOJA	TAC1,BUBLOP
31200		EXCH	TAC3,1(TAC1)
31300		MOVEM	TAC3,0(TAC1)
31400		SETO	TAC4,
31500		AOJA	TAC1,BUBLOP
31600	BUBLP1:	SKIPE	TAC4
31700		SOJA	TAC2,BUBLOP-2
31800	;*****IF LEFTPARTS ARE EQUAL, PREFER THE ONE CLOSER TO THE CENTER
31900		MOVEI	TAC2,AFFMOV
32000	CENLOP:	SKIPG	1(TAC2)
32100		JRST	CENLP1
32200		HLRZ	TAC,0(TAC2)
32300		HLRZ	TAC1,1(TAC2)
32400		CAME	TAC,TAC1
32500		AOJA	TAC2,CENLOP
32600		HRRZ	TAC,0(TAC2)
32700		IDIVI	TAC,BRDWTH
32800		SUBI	TAC,BRDWTH/2
32900		MOVM	TAC,TAC
33000		SUBI	TAC1,BRDWTH/2
33100		MOVM	TAC1,TAC1
33200		ADD	TAC,TAC1	;CENTER SCORE #1
33300		HRRZ	TAC3,1(TAC2)
33400		IDIVI	TAC3,BRDWTH
33500		SUBI	TAC3,BRDWTH/2
33600		MOVM	TAC3,TAC3
33700		SUBI	TAC4,BRDWTH/2
33800		MOVM	TAC4,TAC4
33900		ADD	TAC3,TAC4	;CENTER SCORE #2
34000		CAMG	TAC,TAC3
34100		AOJA	TAC2,CENLOP
34200		MOVE	TAC3,0(TAC2)
34300		EXCH	TAC3,1(TAC2)
34400		MOVEM	TAC3,0(TAC2)
34500		AOJA	TAC2,CENLOP
34600	CENLP1: SKIPLE	AFFMOV
34700		JRST	.+5		;THERE IS A LEAST ONE OK MOVE
34800		MOVEI	TAC5,=11
34900		SKIPN	FORSAV
35000		MOVN	TAC5,TAC5
35100		JRST	SEXCSS+1	;THERE WERE NO LEGAL MOVES TO SORT
35200	;*****FILL IFORCE VECTOR WITH MOVE SELECTIONS
35300		SETZM	AFFMOV+4	;MAKE SURE PHASE ONE CUTOFF OBEYED
35400		MOVE	TAC1,NDXFOR
35500		CAIL	TAC1,PH1CUT
35600		SETZM	AFFMOV+2	;MAKE SURE PHASE TWO CUTOFF OBEYED
35700		SETZ	TAC1,
35800		SKIPG	TAC2,AFFMOV(TAC1)
35900		JRST	CENLP2
36000		HRRZM	TAC2,IFORCE(TAC1)	;MOVE LOCATION
36100		HLRZM	TAC2,HEURBT(TAC1)	;MOVE SCORE
36200		AOJA	TAC1,.-4
36300	CENLP2:	SKIPE	FORSAV
36400		POPJ	PDP,
36500		SKIPN	SAVWIN
36600		SKIPE	SAVWN1
36700	BUBLP3:	SETZM	BNDCNL		;MAKE SURE NO GETA IS TRIED
36800		POPJ	PDP,		;IS OK TO TRY GETA
     

00100	BEGIN LIBERT
00200	
00300	;**********
00400	;	LIBEST IS AN ALMOST-ALGORITHMIC LIBERTY ESTIMATOR.  EXCEPT
00500	;FOR QUITE SPECIAL CASES, IT IS COMPLETELY ACCURATE.  IN ALMOST EVERY
00600	;CASE WHERE LIBEST IS WRONG, THE ERROR DOES NOT AFFECT WHAT THE PROGRAM
00700	;DOES.  THE ACTUAL NUMBER OF LIBERTIES IS CALCULATED FOR BOTH A FRIENDLY
00800	;AND AN ENEMY MOVE AT THE PROPOSED MOVE POINT.  KO IS DETECTED, AND ANY
00900	;CAPTURED STRING IS FULLY INVESTIGATED TO FIND HOW MANY LIBERTIES IT ADDS.
01000	;NOTE TAC (PROPOSED MOVE POINT) AND FRIEND (WHICH SIDE IS FRIENDLY) MUST
01100	;BE SET BY THE CALLING ROUTINE.  LIBEST CLOBBERS MANY REGISTERS.
01200	;**********
01300		INTERN	NGHSTR,LIBVEC,LIBEST
01400	↑↑LIBVEC:	;HEADER NAME FOR INFO VECTOR RETURNED BY LIBEST
01500	;***LHS OF ACTLB. CONTAINS TOTAL OF ALL LIBS ADDED BY CAPTURES
01600	ACTLBF:	0		;RHS HAS ACTUAL NUMBER OF FRIENDLY LIBERTIES
01700	ACTLBE:	0		;RHS HAS ACTUAL NUMBER OF ENEMY LIBERTIES
01800	FRDSTR:	0		;LIBERTIES ADDED TO FRIENDLY BY NEIGHBORS
01900	ENMSTR:	0		;LIBERTIES ADDED TO ENEMY BY NEIGHBORS
02000	NUMCAE:	0		;NUMBER OF CAPTURED ENEMY STONES (BY FRIENDLY)
02100	NUMCAF:	0		;NUMBER OF CAPTURED FRIENDLY STONES (BY ENEMY)
02200	FRDDUP:	0		;NUMBER OF DUPLICATED FRIENDLY LIBERTIES
02300	ENMDUP:	0		;NUMBER OF DUPLICATED ENEMY LIBERTIES
02400	;***NOTE TO HERE THAT LIBVEC HAS FRIENDLY QUANTITIES PRECEEDING ENEMY
02500	;***QUANTITIES IN THE VECTOR.
02600	BLANKS:	0		;NUMBER OF ADJACENT BLANKS
02700	KOTEST:	0		;KO MASK AS REQUIRED BY AUXBTS IN GOLOOK
02800	↑↑NGHSTR:BLOCK	12		;NEIGHBORS, CAPTURED NEIGHBORS
02900	↑↑LIBEST:MOVEI	TAC1,7
03000		SETZM	LIBVEC+2(TAC1)
03100		SOJGE	TAC1,.-1
03200		MOVEI	TAC1,3
03300		SETZM	NGHSTR			;HOLDS USED STRING #'S
03400		SETZM	NGHSTR+5		;HOLDS CAPTURED STRING #'S
03500		SETZ	TAC2,			;KO CALCULATION BOOKKEEPER
03600	LIBES2:	LDB	SEARCH,[POINT 7,@GB1TST(TAC1),35]	;STRING #
03700		JUMPN	SEARCH,LIBES3
03800		TLO	TAC2,KOTAKS+KOTAKF	;THIS MOVE CANT EVER BE KO
03900		AOS	BLANKS			;COUNT THIS BLANK
04000		MOVE	TAC5,@GB1TST+1(TAC1)
04100		AND	TAC5,@G1DIAG+1(TAC1)
04200		ANDI	TAC5,BLKOCC+WHTOCC
04300		JUMPE	TAC5,LIBES1
04400		JRST	LIBES8
04500	LIBES3:	CAIN	SEARCH,177
04600		JRST	LIBES1			;POINT IS OFF EDGE
04700		MOVEI	TAC3,NGHSTR		;OLD USED STRING #'S
04800		SKIPN	TAC4,0(TAC3)
04900		JRST	.+4
05000		CAME	SEARCH,TAC4
05100		AOJA	TAC3,.-3
05200		JRST	LIBES7			;HAVE SEEN THIS STRING ALREADY
05300		MOVEM	SEARCH,0(TAC3)		;SAVE NEW STRING NAME
05400		SETZM	1(TAC3)
05500		LDB	TAC3,[POINT 9,STRPTR(SEARCH),35]	;# LIBS
05600		TDNN	FRIEND,@GB1TST(TAC1)
05700		JRST	LIBES5
05800		TLO	TAC2,KOTAKS		;CANT BE KO FOR SAVER
05900		SOJN	TAC3,LIBES4
06000	;*****ONE-LIB TARGET-SIDE STRING
06100		LDB	TAC4,[POINT 9,STRPTR(SEARCH),26]
06200		ADDM	TAC4,NUMCAF		;# FRIENDLY-SIDE PRISONERS
06300		JRST	LIBES6
06400	LIBES4:	ADDM	TAC3,FRDSTR		;SAVER LIBS ADD
06500		JRST	LIBES7
06600	LIBES5:	TLO	TAC2,KOTAKF		;CANT BE KO FOR FORCER
06700		SOJN	TAC3,LIBES7-1
06800	;*****ONE-LIB ENEMY-SIDE STRING
06900		LDB	TAC4,[POINT 9,STRPTR(SEARCH),26]
07000		ADDM	TAC4,NUMCAE		;# ENEMY-SIDE PRISONERS
07100	LIBES6:	MOVEI	TAC5,NGHSTR+5
07200		SKIPE	0(TAC5)
07300		AOJA	TAC5,.-1
07400		MOVEM	SEARCH,0(TAC5)		;SAVE CAPTURED STRING NAME
07500		SETZM	1(TAC5)			;RESTORE END MARKER
07600		JRST	LIBES7
07700		ADDM	TAC3,ENMSTR		;FORCER LIBS ADD
07800	;*****CHECK FOR THE SIMPLEST SORTS OF DUPLICATIONS
07900	LIBES7:	MOVE	TAC5,@GB1TST(TAC1)
08000		AND	TAC5,@GB1TST+1(TAC1)
08100		ANDI	TAC5,BLKOCC+WHTOCC
08200		JUMPE	TAC5,.+3
08300		MOVE	TAC4,@G1DIAG+1(TAC1)
08400		JRST	LIBES8-2
08500		MOVE	TAC5,@GB1TST(TAC1)
08600		AND	TAC5,@G1DIAG+1(TAC1)
08700		ANDI	TAC5,BLKOCC+WHTOCC
08800		JUMPE	TAC5,LIBES1
08900		MOVE	TAC4,@GB1TST+1(TAC1)
09000		TRNN	TAC4,BNKOCC
09100		JRST	LIBES1
09200	LIBES8:	TDNN	TAC5,FRIEND
09300		AOSA	ENMDUP		;DUPLICATE ENEMY-SIDE LIB
09400		AOS	FRDDUP		;DUPLICATE FRIENDLY-SIDE LIB
09500	LIBES1:	SOJGE	TAC1,LIBES2
09600	;*****THE KOTAK BITS ARE LEFT ON IF THIS POINT IS A KO CAPTURE
09700		TLCE	TAC2,KOTAKS
09800		JRST	.+4		;CANT BE KO FOR SAVER
09900		MOVE	TAC1,NUMCAE
10000		CAIE	TAC1,1
10100		TLZ	TAC2,KOTAKS	;CANT BE KO FOR SAVER
10200		TLCE	TAC2,KOTAKF
10300		JRST	.+4		;CANT BE KO FOR FORCER
10400		MOVE	TAC1,NUMCAF
10500		CAIE	TAC1,1
10600		TLZ	TAC2,KOTAKF	;CANT BE KO FOR FORCER
10700		MOVEM	TAC2,KOTEST
10800		MOVE	TAC1,BLANKS
10900		ADD	TAC1,FRDSTR
11000		SUB	TAC1,FRDDUP
11100		MOVEM	TAC1,ACTLBF	;ACTUAL NUMBER OF FRIENDLY LIBS
11200		MOVE	TAC1,BLANKS
11300		ADD	TAC1,ENMSTR
11400		SUB	TAC1,ENMDUP
11500		MOVEM	TAC1,ACTLBE	;ACTUAL NUMBER OF ENEMY LIBS
11600	;*****SEE IF CAPTURED STRINGS MODIFY LIBERTY ESTIMATE
11700		MOVEI	TAC5,NGHSTR+5
11800	LIBES9:	SKIPN	SEARCH,0(TAC5)
11900		POPJ	PDP,
12000		HRLM	TAC,0(PDP)	;DONT DESTROY CURRENT POINT POINTER
12100		PUSHJ	PDP,CAPLBS
12200		HLRZ	TAC,0(PDP)
12300		MOVE	TAC1,TACSAV
12400		HRL	TAC4,TAC4	;PUT # LIBS ADDED IN LHS ALSO
12500		TDNN	FRIEND,GB1(TAC1)
12600		JRST	.+3
12700		ADDM	TAC4,ACTLBE	;LIBS FROM CAPTURED FRIENDLY STRING
12800		AOJA	TAC5,LIBES9
12900		ADDM	TAC4,ACTLBF	;LIBS FROM CAPTURED ENEMY STRING
13000		AOJA	TAC5,LIBES9
13100	
13200	;**********
13300	;	WE NEED A RECURSIVE SEARCH ALONG ANY CAPTURED STRING TO DETERMINE
13400	;HOW MANY LIBERTIES THE CAPTURING MOVE "REALLY" GAINS FROM THE CAPTURE.
13500	;NOTE THIS PROCEDURE WILL WORK WHENEVER NGHSTR IS PROPERLY SET UP.
13600	;**********
13700	CAPLBS:	PUSHJ	PDP,STRSET+1
13800		MOVE	TAC1,[PUSHJ PDP,CAPLB1]
13900		MOVEM	TAC1,DRIVR1-3
14000		SETZ	TAC4,			;HOLDS # LIBS GAINED
14100	CAPLB1:	MOVEI	TAC1,3
14200		LDB	TAC2,[POINT 7,@GB1TST(TAC1),35]
14300		JUMPE	TAC2,CAPLB4
14400		CAME	TAC2,SEARCH
14500		CAMN	TAC2,REPLCE
14600		JRST	CAPLB2			;POINT IN CAPTURED STRING
14700		MOVEI	TAC3,NGHSTR
14800	CAPLB3:	SKIPN	0(TAC3)
14900		JRST	CAPLB2			;NO MORE POSSIBLE STRINGS
15000		CAMN	TAC2,0(TAC3)
15100	CAPLB4:	AOJA	TAC4,ADLEND+1		;FOUND AN ADDED LIBERTY
15200		AOJA	TAC3,CAPLB3
15300	CAPLB2:	SOJGE	TAC1,CAPLB1+1
15400		JRST	ADLEND+1
15500	
15600	BEND
15700	
15800		END